{"id":1720140,"user_name":null,"score":3,"text":"Przyznaje, \u017ce dyskutowa\u0107 na kodzie to lubi\u0119.\nTutaj mo\u017ce troszk\u0119 przyk\u0142ad \u015bredni - bo nie mamy funkcji 15LOC kt\u00f3r\u0105 rozbijamy na 5x3LOC.\nJu\u017c wyj\u015bciowa funkcja to tak 5 linii (+ klamry) - wi\u0119c taki sobie przyk\u0142ad.\nDo tego dosy\u0107 popularne w szkole zagadnienie, dlatego czytelno\u015b\u0107 od razu lepsza ni\u017c analogicznym kodzie o podobnej z\u0142o\u017cono\u015bci (znana domena).\n\n1. Przer\u00f3bmy na kotlin (wol\u0119 to ni\u017c pseudoj\u0119zyk w kt\u00f3rym wszystko mo\u017ce lub nie mo\u017ce dzia\u0142a\u0107 w zale\u017cno\u015bci kto pyta)\n\n```kotlin\nobject Roots {\n    fun hasPositiveRoot(a: Double, b: Double, c: Double): Boolean {\n        val delta = b * b - 4 * a * c\n        if (delta < 0) {\n            throw Exception(\"Polynomial has no real roots\")\n        }\n\n        val x1 = (-b + Math.sqrt(delta)) \/ (2 * a)\n        val x2 = (-b - Math.sqrt(delta)) \/ (2 * a)\n        return x1 > 0 || x2 > 0\n    }\n}\n\n```\n\n2. To moja propozycja 2:\n\n```kotlin\nobject Roots2 {\n    fun hasPositiveRoot(a: Double, b: Double, c: Double): Boolean =\n        calcRoots(a, b, c)?.let { (x1, x2) ->\n            x1 > 0 || x2 > 0 \n        } ?: throw Exception(\"Polynomial has no real roots\")\n\n    private fun calcRoots(a: Double, b: Double, c: Double): Pair<Double, Double>? =\n        calcDelta(a, b, c).let { delta ->\n            when {\n                delta < 0 -> null\n                else -> Pair(-b + Math.sqrt(delta) \/ (2 * a), -b - Math.sqrt(delta) \/ (2 * a))\n            }\n        }\n\n    private fun calcDelta(a: Double, b: Double, c: Double) = b * b - 4 * a * c\n}\n```\n\njak wida\u0107 - nieco wi\u0119cej kodu. Czytelno\u015b\u0107 do os\u0105du.\n\n\n3. W trakcie prac wpadam na pomys\u0142 zrobienia bardziej og\u00f3lnej funkcji `any` (kt\u00f3rej nie ma w standardzie dla `Pair`)\n\n```kotlin\nobject Roots3 {\n    fun hasPositiveRoot(a: Double, b: Double, c: Double): Boolean =\n        calcRoots(a, b, c)?.let { roots -> roots.any{it > 0 }\n        } ?: throw Exception(\"Polynomial has no real roots\")\n\n    private fun calcRoots(a: Double, b: Double, c: Double): Pair<Double, Double>? =\n        calcDelta(a, b, c).let { delta ->\n            when {\n                delta < 0 -> null\n                else -> Pair(-b + Math.sqrt(delta) \/ (2 * a), -b - Math.sqrt(delta) \/ (2 * a))\n            }\n        }\n\n    private fun calcDelta(a: Double, b: Double, c: Double) = b * b - 4 * a * c\n}\n\nfun <A> Pair<A,A>.any(p: (A)->Boolean) = p(this.first) || p(this.second)\n```\n\nczytelno\u015b\u0107 do os\u0105du, ale spodoba\u0142o mi si\u0119, \u017ce mam now\u0105 generyczn\u0105 funkcj\u0119 do u\u017cycia (kt\u00f3rej nie widz\u0119 w standardzie)\n\n3. A co do` dlaczego ignorujemy spadek wydajno\u015bci`...\n\nTest w jmh:\n```java\n    @Benchmark\n    public void root1(Blackhole blackhole) {\n        blackhole.consume(Roots.INSTANCE.hasPositiveRoot(1.0, -2.0, 1.0));\n        blackhole.consume(Roots.INSTANCE.hasPositiveRoot(2.0, -2.0, -10.0));\n        blackhole.consume(Roots.INSTANCE.hasPositiveRoot(-2.0,-2.0, +10.0));\n        blackhole.consume(Roots.INSTANCE.hasPositiveRoot(2.0,+16.0, 10.0));\n\n    }\n\n    @Benchmark\n    public void root2(Blackhole blackhole) {\n        blackhole.consume(Roots2.INSTANCE.hasPositiveRoot(1.0, -2.0, 1.0));\n        blackhole.consume(Roots2.INSTANCE.hasPositiveRoot(2.0, -2.0, -10.0));\n        blackhole.consume(Roots2.INSTANCE.hasPositiveRoot(-2.0,-2.0, +10.0));\n        blackhole.consume(Roots2.INSTANCE.hasPositiveRoot(2.0,+16.0, 10.0));\n    }\n\n    @Benchmark\n    public void root3(Blackhole blackhole) {\n        blackhole.consume(Roots3.INSTANCE.hasPositiveRoot(1.0, -2.0, 1.0));\n        blackhole.consume(Roots3.INSTANCE.hasPositiveRoot(2.0, -2.0, -10.0));\n        blackhole.consume(Roots3.INSTANCE.hasPositiveRoot(-2.0,-2.0, +10.0));\n        blackhole.consume(Roots3.INSTANCE.hasPositiveRoot(2.0,+16.0, 10.0));\n    }\n```\n\nWynik - pod java 8\n\n```\nopenjdk version \"1.8.0_265\"\nOpenJDK Runtime Environment (AdoptOpenJDK)(build 1.8.0_265-b01)\nOpenJDK 64-Bit Server VM (AdoptOpenJDK)(build 25.265-b01, mixed mode)\n\n# Run complete. Total time: 00:04:17 \n\nBenchmark        Mode  Cnt        Score       Error   Units\nBenchmark        Mode  Cnt        Score       Error   Units\nRootTest.root1  thrpt   10  2213477.178 \u00b1 62301.769  ops\/ms\nRootTest.root2  thrpt   10  2247239.569 \u00b1 21727.944  ops\/ms\nRootTest.root3  thrpt   10  1954872.265 \u00b1 36531.114  ops\/ms\n\n```\n\nTest zrobiony na brudno - ma\u0142e ilo\u015bci iteracji itp. nie chcia\u0142o mi si\u0119 czeka\u0107. \nJak wida\u0107 mierzalny spadek wydajno\u015bci jest... dla wersji 3.\nWersja 2 zaliczy\u0142a nawet wzrost wydajno\u015bci, ale to raczej wynik przeprowadzania testu  na nieczystym komputerze. (ale 4 minuty czasu powinny wi\u0119kszo\u015b\u0107 u\u015bredni\u0107).\n!!! **Nie testowa\u0142em (w jmh) przypadku z wyj\u0105tkiem**  (to oczywi\u015bcie mo\u017ce mie\u0107 wp\u0142yw na wyniki... ale dyskusja o performance i wrzucanie w kod wyj\u0105tku to i tak jest WTF.\n\n\nSam bym pewnie wybra\u0142 wersj\u0119 Roots3... ale w tym przypadku **i funkcja wyj\u015bciowa mnie nie razi** - nie widz\u0119 istotnych r\u00f3\u017cnic o kt\u00f3re kruszy\u0142bym kopie.\n (razi wyj\u0105tek, ale takie by\u0142o dziwne za\u0142o\u017cenie). Zrobi\u0142em funkcje jako wyra\u017cenia (nie bardzo umiem pisa\u0107 inaczej), ale to nie ma wp\u0142ywu - orygina\u0142 te\u017c si\u0119 da przerobi\u0107.\nEDIT:\nBonusik inspirowany @stivens \ni benchmark na graal\n```\nobject Roots4 {\n    fun hasPositiveRoot(a: Double, b: Double, c: Double): Boolean =\n        calcRoots(a, b, c).let{roots->\n            if (roots.isEmpty()) {\n                throw Exception(\"Polynomial has no real roots\")\n            } else {\n                roots.any { it >0}\n            }\n        }\n\n    private fun calcRoots(a: Double, b: Double, c: Double): List<Double> =\n        calcDelta(a, b, c).let { delta ->\n            when {\n                delta < 0 -> emptyList()\n                else -> listOf(-b + Math.sqrt(delta) \/ (2 * a), -b - Math.sqrt(delta) \/ (2 * a))\n            }\n        }\n\n    private fun calcDelta(a: Double, b: Double, c: Double) = b * b - 4 * a * c\n}\n\nopenjdk version \"11.0.6\" 2020-01-14\nOpenJDK Runtime Environment GraalVM CE 20.0.0 (build 11.0.6+9-jvmci-20.0-b02)\nOpenJDK 64-Bit Server VM GraalVM CE 20.0.0 (build 11.0.6+9-jvmci-20.0-b02, mixed mode, sharing)\n\n\nRootTest.root1  thrpt   10  2226808.045 \u00b1 31160.479  ops\/ms\nRootTest.root2  thrpt   10  2245523.806 \u00b1 11443.862  ops\/ms\nRootTest.root3  thrpt   10  2252279.079 \u00b1 12245.590  ops\/ms\nRootTest.root4  thrpt   10  1178294.124 \u00b1 95669.136  ops\/ms\n\/\/tu zostawi\u0142em komp w spokoju - przez co pierwsze 3 rozwi\u0105zania wysz\u0142y takie same (r\u00f3\u017cnice w granicach b\u0142\u0119du). \n\/\/Co jest mniej wi\u0119cej oczekiwane dla wsp\u00f3\u0142czesnego kompilatora.\n\/\/ 4 z list\u0105 te\u017c powinno wyj\u015b\u0107 podobnie, ale ewidentnie gdzie\u015b si\u0119 tam jvm gubi (mo\u017ce dam rad\u0119 sprawdzi\u0107).\n\n```\n\nEDIT2: **Oczywi\u015bcie zrypa\u0142em**\nA w zasadzie zapomnia\u0142em doda\u0107:\n```\nkotlinOptions {\n        jvmTarget = \"1.8\"\n}\n```\na wtedy mamy takie wyniki:\n```\nRootTest.root1   thrpt   10  105464536.758 \u00b1 744275.505  ops\/ms\nRootTest.root2   thrpt   10  105784580.750 \u00b1 490385.882  ops\/ms\nRootTest.root3   thrpt   10  105058999.688 \u00b1 549347.307  ops\/ms\nRootTest.root4   thrpt   10    1823427.831 \u00b1 290128.766  ops\/ms\nRootTest.root4v  thrpt   10    2900448.685 \u00b1 129014.900  ops\/ms\n```\nKto\u015b m\u00f3g\u0142by spyta\u0107, `a co to root4v?` - a to to samo co root4. Tylko, \u017ce zamiast kotlinowej listy, jest Lista z Vavr... kt\u00f3ra w \u015brodku jest LinkedList\u0105 i jak ka\u017cdy wie jest wolniejsza... \nTym niemniej, mimo \u017ce teraz lista VAVR jest szybsza (na tym samym sprz\u0119cie) ni\u017c oryginalne funkcje kompilowane pod java 6. To te funkcje dosta\u0142y ultra kopa.\n(Mam nadziej\u0119, \u017ce to nie oznacza, \u017ce jmh si\u0119 wywali\u0142 :-), poprawka po przej\u015bciu na java8 jest troch\u0119 za dobra)\n\nEDIT 3:\n@stivens  Bingo! - twoja sugestia z komentarza, \u017ceby u\u017cy\u0107 DoubleArray -wyunik jak na Pair (!!!)\n```\nRootTest.root4   thrpt   10  102794229.462 \u00b1 6409465.868  ops\/ms\nRootTest.root4v  thrpt   10    2951965.456 \u00b1   96099.156  ops\/ms\n\n```\n(ale tak po prawdzie ca\u0142y czas mam w\u0105tpliwo\u015bci, \u017ce co\u015b si\u0119 zepsu\u0142o (blackhole nie dzia\u0142a?)","edit_count":17,"is_voted":null,"is_accepted":null,"is_subscribed":null,"user_id":78878,"deleter_name":null,"delete_reason":null,"orderingScore":3,"created_at":"2020-11-02T00:21:51+01:00","updated_at":"2020-11-02T01:59:51+01:00","deleted_at":null,"user":{"id":78878,"name":"jarekr000000","is_online":false,"bio":"Zgadzam si\u0119 ze wszystkimi przedm\u00f3wcami","location":"U krasnolud\u00f3w - pod g\u00f3r\u0105","allow_sig":1,"allow_count":1,"allow_smilies":1,"posts":4730,"visited_at":"2026-07-10T04:40:11.000000Z","created_at":"2016-09-15T21:38:28.000000Z","initials":"J0","is_verified":false,"is_deleted":false,"is_incognito":false,"is_blocked":false,"is_blocked_perm":false,"deleted_at":null,"photo":"\/uploads\/photo\/ggwraKmclN3ZY0QlPKdtjGBOBOZVZJKgtoPWSDuz.jpg","sig":"jeden i p\u00f3\u0142 terabajta powinno wystarczy\u0107 ka\u017cdemu\n"},"html":"<p>Przyznaje, \u017ce dyskutowa\u0107 na kodzie to lubi\u0119.<br \/>\nTutaj mo\u017ce troszk\u0119 przyk\u0142ad \u015bredni - bo nie mamy funkcji 15LOC kt\u00f3r\u0105 rozbijamy na 5x3LOC.<br \/>\nJu\u017c wyj\u015bciowa funkcja to tak 5 linii (+ klamry) - wi\u0119c taki sobie przyk\u0142ad.<br \/>\nDo tego dosy\u0107 popularne w szkole zagadnienie, dlatego czytelno\u015b\u0107 od razu lepsza ni\u017c analogicznym kodzie o podobnej z\u0142o\u017cono\u015bci (znana domena).<\/p>\n<ol>\n<li>Przer\u00f3bmy na kotlin (wol\u0119 to ni\u017c pseudoj\u0119zyk w kt\u00f3rym wszystko mo\u017ce lub nie mo\u017ce dzia\u0142a\u0107 w zale\u017cno\u015bci kto pyta)<\/li>\n<\/ol>\n<div class=\"markdown-code\"><div class=\"copy-button\">Kopiuj<\/div><pre><code class=\"language-kotlin line-numbers\">object Roots {\n    fun hasPositiveRoot(a: Double, b: Double, c: Double): Boolean {\n        val delta = b * b - 4 * a * c\n        if (delta &lt; 0) {\n            throw Exception(\"Polynomial has no real roots\")\n        }\n\n        val x1 = (-b + Math.sqrt(delta)) \/ (2 * a)\n        val x2 = (-b - Math.sqrt(delta)) \/ (2 * a)\n        return x1 &gt; 0 || x2 &gt; 0\n    }\n}\n\n<\/code><\/pre><\/div>\n<ol>\n<li>To moja propozycja 2:<\/li>\n<\/ol>\n<div class=\"markdown-code\"><div class=\"copy-button\">Kopiuj<\/div><pre><code class=\"language-kotlin line-numbers\">object Roots2 {\n    fun hasPositiveRoot(a: Double, b: Double, c: Double): Boolean =\n        calcRoots(a, b, c)?.let { (x1, x2) -&gt;\n            x1 &gt; 0 || x2 &gt; 0 \n        } ?: throw Exception(\"Polynomial has no real roots\")\n\n    private fun calcRoots(a: Double, b: Double, c: Double): Pair&lt;Double, Double&gt;? =\n        calcDelta(a, b, c).let { delta -&gt;\n            when {\n                delta &lt; 0 -&gt; null\n                else -&gt; Pair(-b + Math.sqrt(delta) \/ (2 * a), -b - Math.sqrt(delta) \/ (2 * a))\n            }\n        }\n\n    private fun calcDelta(a: Double, b: Double, c: Double) = b * b - 4 * a * c\n}\n<\/code><\/pre><\/div>\n<p>jak wida\u0107 - nieco wi\u0119cej kodu. Czytelno\u015b\u0107 do os\u0105du.<\/p>\n<ol>\n<li>W trakcie prac wpadam na pomys\u0142 zrobienia bardziej og\u00f3lnej funkcji <code>any<\/code> (kt\u00f3rej nie ma w standardzie dla <code>Pair<\/code>)<\/li>\n<\/ol>\n<div class=\"markdown-code\"><div class=\"copy-button\">Kopiuj<\/div><pre><code class=\"language-kotlin line-numbers\">object Roots3 {\n    fun hasPositiveRoot(a: Double, b: Double, c: Double): Boolean =\n        calcRoots(a, b, c)?.let { roots -&gt; roots.any{it &gt; 0 }\n        } ?: throw Exception(\"Polynomial has no real roots\")\n\n    private fun calcRoots(a: Double, b: Double, c: Double): Pair&lt;Double, Double&gt;? =\n        calcDelta(a, b, c).let { delta -&gt;\n            when {\n                delta &lt; 0 -&gt; null\n                else -&gt; Pair(-b + Math.sqrt(delta) \/ (2 * a), -b - Math.sqrt(delta) \/ (2 * a))\n            }\n        }\n\n    private fun calcDelta(a: Double, b: Double, c: Double) = b * b - 4 * a * c\n}\n\nfun &lt;A&gt; Pair&lt;A,A&gt;.any(p: (A)-&gt;Boolean) = p(this.first) || p(this.second)\n<\/code><\/pre><\/div>\n<p>czytelno\u015b\u0107 do os\u0105du, ale spodoba\u0142o mi si\u0119, \u017ce mam now\u0105 generyczn\u0105 funkcj\u0119 do u\u017cycia (kt\u00f3rej nie widz\u0119 w standardzie)<\/p>\n<ol>\n<li>A co do<code> dlaczego ignorujemy spadek wydajno\u015bci<\/code>...<\/li>\n<\/ol>\n<p>Test w jmh:<\/p>\n<div class=\"markdown-code\"><div class=\"copy-button\">Kopiuj<\/div><pre><code class=\"language-java line-numbers\">    @Benchmark\n    public void root1(Blackhole blackhole) {\n        blackhole.consume(Roots.INSTANCE.hasPositiveRoot(1.0, -2.0, 1.0));\n        blackhole.consume(Roots.INSTANCE.hasPositiveRoot(2.0, -2.0, -10.0));\n        blackhole.consume(Roots.INSTANCE.hasPositiveRoot(-2.0,-2.0, +10.0));\n        blackhole.consume(Roots.INSTANCE.hasPositiveRoot(2.0,+16.0, 10.0));\n\n    }\n\n    @Benchmark\n    public void root2(Blackhole blackhole) {\n        blackhole.consume(Roots2.INSTANCE.hasPositiveRoot(1.0, -2.0, 1.0));\n        blackhole.consume(Roots2.INSTANCE.hasPositiveRoot(2.0, -2.0, -10.0));\n        blackhole.consume(Roots2.INSTANCE.hasPositiveRoot(-2.0,-2.0, +10.0));\n        blackhole.consume(Roots2.INSTANCE.hasPositiveRoot(2.0,+16.0, 10.0));\n    }\n\n    @Benchmark\n    public void root3(Blackhole blackhole) {\n        blackhole.consume(Roots3.INSTANCE.hasPositiveRoot(1.0, -2.0, 1.0));\n        blackhole.consume(Roots3.INSTANCE.hasPositiveRoot(2.0, -2.0, -10.0));\n        blackhole.consume(Roots3.INSTANCE.hasPositiveRoot(-2.0,-2.0, +10.0));\n        blackhole.consume(Roots3.INSTANCE.hasPositiveRoot(2.0,+16.0, 10.0));\n    }\n<\/code><\/pre><\/div>\n<p>Wynik - pod java 8<\/p>\n<div class=\"markdown-code\"><div class=\"copy-button\">Kopiuj<\/div><pre><code>openjdk version \"1.8.0_265\"\nOpenJDK Runtime Environment (AdoptOpenJDK)(build 1.8.0_265-b01)\nOpenJDK 64-Bit Server VM (AdoptOpenJDK)(build 25.265-b01, mixed mode)\n\n# Run complete. Total time: 00:04:17 \n\nBenchmark        Mode  Cnt        Score       Error   Units\nBenchmark        Mode  Cnt        Score       Error   Units\nRootTest.root1  thrpt   10  2213477.178 \u00b1 62301.769  ops\/ms\nRootTest.root2  thrpt   10  2247239.569 \u00b1 21727.944  ops\/ms\nRootTest.root3  thrpt   10  1954872.265 \u00b1 36531.114  ops\/ms\n\n<\/code><\/pre><\/div>\n<p>Test zrobiony na brudno - ma\u0142e ilo\u015bci iteracji itp. nie chcia\u0142o mi si\u0119 czeka\u0107.<br \/>\nJak wida\u0107 mierzalny spadek wydajno\u015bci jest... dla wersji 3.<br \/>\nWersja 2 zaliczy\u0142a nawet wzrost wydajno\u015bci, ale to raczej wynik przeprowadzania testu  na nieczystym komputerze. (ale 4 minuty czasu powinny wi\u0119kszo\u015b\u0107 u\u015bredni\u0107).<br \/>\n!!! <strong>Nie testowa\u0142em (w jmh) przypadku z wyj\u0105tkiem<\/strong>  (to oczywi\u015bcie mo\u017ce mie\u0107 wp\u0142yw na wyniki... ale dyskusja o performance i wrzucanie w kod wyj\u0105tku to i tak jest WTF.<\/p>\n<p>Sam bym pewnie wybra\u0142 wersj\u0119 Roots3... ale w tym przypadku <strong>i funkcja wyj\u015bciowa mnie nie razi<\/strong> - nie widz\u0119 istotnych r\u00f3\u017cnic o kt\u00f3re kruszy\u0142bym kopie.<br \/>\n(razi wyj\u0105tek, ale takie by\u0142o dziwne za\u0142o\u017cenie). Zrobi\u0142em funkcje jako wyra\u017cenia (nie bardzo umiem pisa\u0107 inaczej), ale to nie ma wp\u0142ywu - orygina\u0142 te\u017c si\u0119 da przerobi\u0107.<br \/>\nEDIT:<br \/>\nBonusik inspirowany @stivens<br \/>\ni benchmark na graal<\/p>\n<div class=\"markdown-code\"><div class=\"copy-button\">Kopiuj<\/div><pre><code>object Roots4 {\n    fun hasPositiveRoot(a: Double, b: Double, c: Double): Boolean =\n        calcRoots(a, b, c).let{roots-&gt;\n            if (roots.isEmpty()) {\n                throw Exception(\"Polynomial has no real roots\")\n            } else {\n                roots.any { it &gt;0}\n            }\n        }\n\n    private fun calcRoots(a: Double, b: Double, c: Double): List&lt;Double&gt; =\n        calcDelta(a, b, c).let { delta -&gt;\n            when {\n                delta &lt; 0 -&gt; emptyList()\n                else -&gt; listOf(-b + Math.sqrt(delta) \/ (2 * a), -b - Math.sqrt(delta) \/ (2 * a))\n            }\n        }\n\n    private fun calcDelta(a: Double, b: Double, c: Double) = b * b - 4 * a * c\n}\n\nopenjdk version \"11.0.6\" 2020-01-14\nOpenJDK Runtime Environment GraalVM CE 20.0.0 (build 11.0.6+9-jvmci-20.0-b02)\nOpenJDK 64-Bit Server VM GraalVM CE 20.0.0 (build 11.0.6+9-jvmci-20.0-b02, mixed mode, sharing)\n\n\nRootTest.root1  thrpt   10  2226808.045 \u00b1 31160.479  ops\/ms\nRootTest.root2  thrpt   10  2245523.806 \u00b1 11443.862  ops\/ms\nRootTest.root3  thrpt   10  2252279.079 \u00b1 12245.590  ops\/ms\nRootTest.root4  thrpt   10  1178294.124 \u00b1 95669.136  ops\/ms\n\/\/tu zostawi\u0142em komp w spokoju - przez co pierwsze 3 rozwi\u0105zania wysz\u0142y takie same (r\u00f3\u017cnice w granicach b\u0142\u0119du). \n\/\/Co jest mniej wi\u0119cej oczekiwane dla wsp\u00f3\u0142czesnego kompilatora.\n\/\/ 4 z list\u0105 te\u017c powinno wyj\u015b\u0107 podobnie, ale ewidentnie gdzie\u015b si\u0119 tam jvm gubi (mo\u017ce dam rad\u0119 sprawdzi\u0107).\n\n<\/code><\/pre><\/div>\n<p>EDIT2: <strong>Oczywi\u015bcie zrypa\u0142em<\/strong><br \/>\nA w zasadzie zapomnia\u0142em doda\u0107:<\/p>\n<div class=\"markdown-code\"><div class=\"copy-button\">Kopiuj<\/div><pre><code>kotlinOptions {\n        jvmTarget = \"1.8\"\n}\n<\/code><\/pre><\/div>\n<p>a wtedy mamy takie wyniki:<\/p>\n<div class=\"markdown-code\"><div class=\"copy-button\">Kopiuj<\/div><pre><code>RootTest.root1   thrpt   10  105464536.758 \u00b1 744275.505  ops\/ms\nRootTest.root2   thrpt   10  105784580.750 \u00b1 490385.882  ops\/ms\nRootTest.root3   thrpt   10  105058999.688 \u00b1 549347.307  ops\/ms\nRootTest.root4   thrpt   10    1823427.831 \u00b1 290128.766  ops\/ms\nRootTest.root4v  thrpt   10    2900448.685 \u00b1 129014.900  ops\/ms\n<\/code><\/pre><\/div>\n<p>Kto\u015b m\u00f3g\u0142by spyta\u0107, <code>a co to root4v?<\/code> - a to to samo co root4. Tylko, \u017ce zamiast kotlinowej listy, jest Lista z Vavr... kt\u00f3ra w \u015brodku jest LinkedList\u0105 i jak ka\u017cdy wie jest wolniejsza...<br \/>\nTym niemniej, mimo \u017ce teraz lista VAVR jest szybsza (na tym samym sprz\u0119cie) ni\u017c oryginalne funkcje kompilowane pod java 6. To te funkcje dosta\u0142y ultra kopa.<br \/>\n(Mam nadziej\u0119, \u017ce to nie oznacza, \u017ce jmh si\u0119 wywali\u0142 :-), poprawka po przej\u015bciu na java8 jest troch\u0119 za dobra)<\/p>\n<p>EDIT 3:<br \/>\n@stivens  Bingo! - twoja sugestia z komentarza, \u017ceby u\u017cy\u0107 DoubleArray -wyunik jak na Pair (!!!)<\/p>\n<div class=\"markdown-code\"><div class=\"copy-button\">Kopiuj<\/div><pre><code>RootTest.root4   thrpt   10  102794229.462 \u00b1 6409465.868  ops\/ms\nRootTest.root4v  thrpt   10    2951965.456 \u00b1   96099.156  ops\/ms\n\n<\/code><\/pre><\/div>\n<p>(ale tak po prawdzie ca\u0142y czas mam w\u0105tpliwo\u015bci, \u017ce co\u015b si\u0119 zepsu\u0142o (blackhole nie dzia\u0142a?)<\/p>\n","url":"http:\/\/static.175.128.202.116.clients.your-server.de\/Forum\/Inzynieria_oprogramowania\/345560-kiedy_gruboziarnisty_kod_jest_lepszy?p=1720140#id1720140","is_locked":false,"editor":{"id":78878,"name":"jarekr000000","is_online":false,"bio":"Zgadzam si\u0119 ze wszystkimi przedm\u00f3wcami","location":"U krasnolud\u00f3w - pod g\u00f3r\u0105","allow_sig":1,"allow_count":1,"allow_smilies":1,"posts":4730,"visited_at":"2026-07-10T04:40:11.000000Z","created_at":"2016-09-15T21:38:28.000000Z","initials":"J0","is_verified":false,"is_deleted":false,"is_incognito":false,"is_blocked":false,"is_blocked_perm":false,"deleted_at":null,"photo":"\/uploads\/photo\/ggwraKmclN3ZY0QlPKdtjGBOBOZVZJKgtoPWSDuz.jpg","sig":"jeden i p\u00f3\u0142 terabajta powinno wystarczy\u0107 ka\u017cdemu\n"},"permissions":{"write":false,"delete":false,"update":false,"accept":false},"moderatorPermissions":{"delete":false,"update":false,"accept":false,"merge":false,"sticky":false,"admAccess":false},"comments":{"647883":{"id":647883,"text":"Mialem potestowac u siebie ale dostaje na twarz bledem i `Error while instantiating tests: unable to set 'list' on Runner. This plugin version doesn't seem to be compatible with JMH 1.25` a nie bardzo chce mi sie debugowac co mu nie pasuje","html":"Mialem potestowac u siebie ale dostaje na twarz bledem i <code>Error while instantiating tests: unable to set 'list' on Runner. This plugin version doesn't seem to be compatible with JMH 1.25<\/code> a nie bardzo chce mi sie debugowac co mu nie pasuje\n","post_id":1720140,"created_at":"2020-11-02T13:35:13+01:00","updated_at":"2020-11-02T13:35:13+01:00","user":{"id":79030,"name":"stivens","is_online":false,"initials":"ST","is_verified":null,"is_deleted":true,"is_incognito":false,"is_blocked":false,"is_blocked_perm":false,"deleted_at":"2025-06-21T15:51:46.000000Z","photo":"\/uploads\/photo\/5b\/5b42791b9d2a8.png"},"url":"\/Forum\/Inzynieria_oprogramowania\/345560-kiedy_gruboziarnisty_kod_jest_lepszy?p=1720140#comment-647883","metadata":"eyJpdiI6IkZJZlFSYWhIeC8yU3o0K2p5MGExY2c9PSIsInZhbHVlIjoibEh1dGFqNzBSdW5VYjhjQkdEWGNySlFuSGtscmhNdjI2UDlpcUY5VnhTWHZxd3p5NW83UWRNR2QyTTVRQWs3L294bWdNTkp3ZkNpSDI3MWM5V1ViVFVmMDF0eUhJMVM2T2ErZitZMzhEcUx2bmJLYjIrcXFlZFc5NmdsZ2JTZVVWNzA1T1ZXUUY4RERuVkNZcTFab2pldFVaMEt2UVRlMkpFQUdyY0hkeUFjPSIsIm1hYyI6IjIwMGQ4ZjM5ZTMwNDllZTgyYmZhNTM1NDQ2OTdmZGI0MjFkMWRjYzZlNmY3MDEwMTkwMjhhOGUwOTQ2MTdkZjQiLCJ0YWciOiIifQ==","votes":0,"ownVote":false,"voters":[]},"647889":{"id":647889,"text":"@stivens: dziwne... u mnie dzia\u0142a : https:\/\/github.com\/jarekratajski\/benchmarkiPochwarki\/runs\/1342038477?check_suite_focus=true (ale kojarze, \u017ce widzia\u0142em ten b\u0142\u0105d). wywala sie na `.\/gradlew build` czy na `.\/gradlew jmh` ?","html":"@stivens: dziwne... u mnie dzia\u0142a : <a href=\"https:\/\/github.com\/jarekratajski\/benchmarkiPochwarki\/runs\/1342038477?check_suite_focus=true\" rel=\"nofollow\" target=\"_blank\">https:\/\/github.com\/jarekratajski\/benchmarkiPochwarki\/runs\/1342038477?check_suite_focus=true<\/a> (ale kojarze, \u017ce widzia\u0142em ten b\u0142\u0105d). wywala sie na <code>.\/gradlew build<\/code> czy na <code>.\/gradlew jmh<\/code> ?\n","post_id":1720140,"created_at":"2020-11-02T13:43:51+01:00","updated_at":"2020-11-02T13:44:15+01:00","user":{"id":78878,"name":"jarekr000000","is_online":false,"initials":"J0","is_verified":null,"is_deleted":false,"is_incognito":false,"is_blocked":false,"is_blocked_perm":false,"deleted_at":null,"photo":"\/uploads\/photo\/ggwraKmclN3ZY0QlPKdtjGBOBOZVZJKgtoPWSDuz.jpg"},"url":"\/Forum\/Inzynieria_oprogramowania\/345560-kiedy_gruboziarnisty_kod_jest_lepszy?p=1720140#comment-647889","metadata":"eyJpdiI6IkgybDhYVWYxNktqeFdENkpmaUlrT2c9PSIsInZhbHVlIjoiSW5lRkhMbnF3VXdFNlhkNmRRZHorQ1RXMmhoeW5FWUdNdDEra3BiNFNBNm9oWXlVbEJtZUhyTnNCaVVFRTJYK0NGbjBCdFpoUWxXWTBDdUxJUzlMM3ZKVHhTSjlZcFE4aG9oYiszNFJwS2x1c0FJaHh3eE84Tms0NCtBUi9TcGZNeWY4RkxDc2R0MXBIaWwyQ005U1dIL0psL2hpaHdIc2NjbXdXb1VReHhvPSIsIm1hYyI6Ijc5MmQ5NDhmNWNiMjY1ZmZjZWJiNjFkZWI0YjQ0N2E0MjgwNzQ0M2QwYjk0MzhhODZlNTg0YWEyMjcxODE5MmIiLCJ0YWciOiIifQ==","votes":0,"ownVote":false,"voters":[]},"647891":{"id":647891,"text":"Na `jmh`. Tutaj chyba wyjasnienie: https:\/\/github.com\/melix\/jmh-gradle-plugin\/issues\/175","html":"Na <code>jmh<\/code>. Tutaj chyba wyjasnienie: <a href=\"https:\/\/github.com\/melix\/jmh-gradle-plugin\/issues\/175\" rel=\"nofollow\" target=\"_blank\">https:\/\/github.com\/melix\/jmh-gradle-plugin\/issues\/175<\/a>\n","post_id":1720140,"created_at":"2020-11-02T13:45:32+01:00","updated_at":"2020-11-02T13:45:32+01:00","user":{"id":79030,"name":"stivens","is_online":false,"initials":"ST","is_verified":null,"is_deleted":true,"is_incognito":false,"is_blocked":false,"is_blocked_perm":false,"deleted_at":"2025-06-21T15:51:46.000000Z","photo":"\/uploads\/photo\/5b\/5b42791b9d2a8.png"},"url":"\/Forum\/Inzynieria_oprogramowania\/345560-kiedy_gruboziarnisty_kod_jest_lepszy?p=1720140#comment-647891","metadata":"eyJpdiI6ImwyRE1zeUhaVFN4Q1dwTlZwVTY1d2c9PSIsInZhbHVlIjoiWDE2ejVtSlIxMENOZUE0Qnp4UmhpY0xiWU1DcTBvMXF4STExaG5Kb2phNitjMHFZVmVXMTBpR0JQRGk3aVhHSVozeDJhZFhNNXQxVStqRml5bWN3RDd5ZGNOb2RjM0s4b0FybHNGbzNkak9pbG42VS8wUG50L2t3K1h3eFJVOVp5VUtxZ0t5NlE3RHR2WEtsWEYwVlZLWXA0L3RFMVZmQ3FLaXkzRTNtYitjPSIsIm1hYyI6ImY2YTFiY2VmNDE3NTNhODUyMDc2MDJiZDJiZTkzMTFhYmYwNmM4MWY5ZGYzZDAwNmJjOGNlYWFhOWQ5YjJmZDIiLCJ0YWciOiIifQ==","votes":0,"ownVote":false,"voters":[]},"647893":{"id":647893,"text":"OK. Faktycznie - jmh testowa\u0142em tylko na 8, 11  i na graal (jvm 11). Skoro to problem pluginu to si\u0119 nie b\u0119d\u0119 wg\u0142ebia\u0142.  (Napraw im :-) )","html":"OK. Faktycznie - jmh testowa\u0142em tylko na 8, 11  i na graal (jvm 11). Skoro to problem pluginu to si\u0119 nie b\u0119d\u0119 wg\u0142ebia\u0142.  (Napraw im :-) )\n","post_id":1720140,"created_at":"2020-11-02T13:49:52+01:00","updated_at":"2020-11-02T13:51:31+01:00","user":{"id":78878,"name":"jarekr000000","is_online":false,"initials":"J0","is_verified":null,"is_deleted":false,"is_incognito":false,"is_blocked":false,"is_blocked_perm":false,"deleted_at":null,"photo":"\/uploads\/photo\/ggwraKmclN3ZY0QlPKdtjGBOBOZVZJKgtoPWSDuz.jpg"},"url":"\/Forum\/Inzynieria_oprogramowania\/345560-kiedy_gruboziarnisty_kod_jest_lepszy?p=1720140#comment-647893","metadata":"eyJpdiI6IjZWK2xZN2t5K2dsTnBZb1V2WHFKTEE9PSIsInZhbHVlIjoiSjZzeStXVlIwN25UdUtQL1ppeFd0RWlWZ0N4RHhMWWkzWW1jdVU1WnlMZGR1Q3ZkeXlUUlhLcnNvRXNwQTBVQTBLZ0VYd3NkbXl2RHRxZ3gvWFpmc3dFb3EvWDdTL3dDVnlBYUtmN1lsTWtqdWI1dGkzTXlxallEQzlaR0hVZ1pDVWZsOWhWSmdDWld2S3IxYzVZQVhJSzhMVG5zd1ZlZGlYcUpCQWFRZG5BPSIsIm1hYyI6ImZhOGIzYThiNWIzYzc5M2RjN2IyYWM2MmIxODY3MmUzZTdhMWM3NDA0NTc1OGQ2MDQ4NDgxNmRjMTIyYmYyYzQiLCJ0YWciOiIifQ==","votes":0,"ownVote":false,"voters":[]},"647895":{"id":647895,"text":"Od wrzesnia w sumie nie naprawili :D","html":"Od wrzesnia w sumie nie naprawili :D\n","post_id":1720140,"created_at":"2020-11-02T13:51:13+01:00","updated_at":"2020-11-02T13:51:13+01:00","user":{"id":79030,"name":"stivens","is_online":false,"initials":"ST","is_verified":null,"is_deleted":true,"is_incognito":false,"is_blocked":false,"is_blocked_perm":false,"deleted_at":"2025-06-21T15:51:46.000000Z","photo":"\/uploads\/photo\/5b\/5b42791b9d2a8.png"},"url":"\/Forum\/Inzynieria_oprogramowania\/345560-kiedy_gruboziarnisty_kod_jest_lepszy?p=1720140#comment-647895","metadata":"eyJpdiI6IlpFRGNQVGVzK0x2T2RZVVcrMWJUQlE9PSIsInZhbHVlIjoiYjBXOTc4QmlvaE81blNkNHhHMTg3YjV6N1FBNk51NVJtSUsxN3ZTRzJFMS92Qm8vaHFUTjV0ZnpDTXFvcXh6WVE4MkU1UzY1cHR6ZkNZOWRvNzh1RkZCaFp3TVdTbTBzNHFHVTR1c2NMSzlFSHU0Uit3aGNrOXhCNmJGOWkva2tBTmF3RzFtUzFBQW9DVFFzM1pVbVZBbkduMithZWQrT2JSd21YMUV3TGY4PSIsIm1hYyI6ImQ0MTQ0MGNiYTcxYTc3OGRkN2UyZWFlODY5ZjkwZjE1MjU1ZGNiNjZiYWNkNTg1YzZlNzE1NDhjNmZjMWQ4YWIiLCJ0YWciOiIifQ==","votes":0,"ownVote":false,"voters":[]}},"comments_count":22,"assets":[],"metadata":"eyJpdiI6ImF5dHRmUmdNZGt4ckpxTlo4bDJtcXc9PSIsInZhbHVlIjoiM0dlaWUrZHk5UzZRWTgyalF3SnJ4M1N1WU5SZE5VSWZ2NlVpK3cxejRSNWZJYVZQVjVRMWZCRmI4cE40d293bm5kUmZUcTdzeXNYRHBsRGs1QVZ5Mnl4VVI1cyt0Y01lM2RiMmo2NzB0OFpDQlNBK3dkRER3TG5VZExCZDRnN2oiLCJtYWMiOiIyZjgxZmUzZmNlZDFmN2MzNzY0NmJhNzg3NmU3NzNlYmFlMDZkN2Y5ODA5OTEwNGY5NGIxNTUxOWFkNDk5OTFhIiwidGFnIjoiIn0=","has_review":false,"review_style":"info","parentPostId":null,"childrenFolded":false,"type":"regular","highlighted":false}