1. Куча / Говнокод #27632

    +1

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    https://benchmarksgame-team.pages.debian.net/benchmarksgame/performance/pidigits.html
    
    1.0 	C gcc #6	0.59 	2,444 	1090 	2.37 	100% 100% 100% 98%
    1.1 	C++ g++ #6	0.66 	5,152 	986 	2.63 	100% 100% 100% 100%
    1.2 	Rust #4	 	0.71 	2,672 	799 	0.73 	3% 0% 0% 100% 
    1.2 	Free Pascal #3	0.73 	2,268 	530 	0.73 	0% 0% 100% 0%
    1.4 	F# .NET #6	0.82 	34,428 	905 	0.83 	1% 2% 96% 1%
    1.4 	Haskell GHC #5	0.83 	6,056 	928 	0.84 	0% 99% 1% 1%
    1.5 	Ada 2012 GNAT   0.88 	4,704 	1130 	0.89 	0% 0% 100% 1%
    1.5 	Rust #2	 	0.88 	2,800 	1306 	0.89 	0% 1% 100% 0%
    1.5 	C++ g++ #4	0.89 	4,280 	513 	0.92 	0% 2% 1% 100%
    1.5 	OCaml #7	0.89 	5,968 	593 	0.90 	0% 0% 1% 100%
    1.5 	Swift #2	0.89 	9,256 	600 	0.91 	3% 0% 0% 99%
    1.5 	PHP #5	  	0.91 	13,196 	399 	0.96 	2% 0% 3% 100%
    1.5 	C# .NET #5	0.92 	35,404 	977 	0.96 	98% 3% 2% 1%
    1.6 	Java  #3	0.93 	36,552 	764 	0.98 	2% 3% 1% 99%

    However, Java is one of the fastest and most energy-efficient object-oriented language. Interpreted languages like Perl, Python, and Ruby were among the least energy efficient

    Using the Computer Benchmarks Game, the team of researchers tested these languages by compiling/executing such programs using the state-of-the-art compilers, virtual machines, interpreters, and libraries.

    They then analyzed the performance of the different implementation considering three variables: execution time, memory consumption and energy consumption.

    https://jaxenter.com/energy-efficient-programming-languages-137264.html

    https://jaxenter.com/wp-content/uploads/2017/09/energy-efficient-languages-768x689.png

    https://jaxenter.com/wp-content/uploads/2017/09/energy-efficient-languages-2-768x368.png

    Запостил: 3.14159265, 31 Августа 2021

    Комментарии (43) RSS

    • Разберём скриптушачью пропаганду: «мы конечно сливаем Сишке, но всего в 1.5 раза»

      Меня удивило как в данном «PHP» обговняет «Йажу» и в целом вся эта скриптуха сливает Сишке где-то в полтора раза.

      Ага. «Computer Benchmarks Game»

      Смотрим как state-of-the-art virtual machines реализуют алгоритмы.

      Начнём с «Хацкеля».
      Ой, а что это тут у нас:
      https://benchmarksgame-team.pages.debian.net/benchmarksgame/program/pidigits-ghc-5.html
      foreign import ccall unsafe "gmp.h __gmpz_cmp"
        mpzCmp :: Ptr MPZ -> Ptr MPZ -> IO CInt
      
      foreign import ccall unsafe "gmp.h __gmpz_init_set_ui"
        mpzInitSetUi :: Ptr MPZ -> CWord -> IO ()
      
      foreign import ccall unsafe "gmp.h __gmpz_get_ui"
        mpzGetUi :: Ptr MPZ -> IO CWord

      Подожди, мразь бездарная. Ты ведь просто симпортила написанную на Сишке либу GNU Multiple Precision Arithmetic Library (GMP).
      Ответить
    • Ладно, обсёр. Что там .NET и F#?
      https://benchmarksgame-team.pages.debian.net/benchmarksgame/program/pidigits-fsharpcore-6.html
      
      [<DllImport("gmp",EntryPoint="__gmpz_mul_ui",ExactSpelling=true)>]
      extern void private mpzMulUi(MPZ& _dest, MPZ& _src, int _value)
      
      [<DllImport("gmp",EntryPoint="__gmpz_add",ExactSpelling=true)>]
      extern void private mpzAdd(MPZ& _dest, MPZ& _src, MPZ& _src2)


      >DllImport "gmp"
      Ой. Снова GNU MP Bignum Library.

      А вот вроде в исходнике rust нету gmp. Но есть какой-то extern crate rug

      https://benchmarksgame-team.pages.debian.net/benchmarksgame/program/pidigits-rust-4.html
      
      extern crate rug;
      
      This crate depends on the low-level bindings in the gmp-mpfr-sys crate, which provides RUST FFI bindings for: the GNU Multiple Precision Arithmetic Library (GMP)
      Опять?

      Очевидно, что сваять на дrustне ничего нельзя - поэтому приходится воровать.
      Ответить
    • «Govno»
      https://benchmarksgame-team.pages.debian.net/benchmarksgame/program/pidigits-go-4.html
      Программа начинается так:
      /*
      #cgo LDFLAGS: -lgmp
      #include <gmp.h>
      #include <stdlib.h>
      */
      import "C"

      Все вызовы явно ворованы из С.

      «Йажа»
      https://benchmarksgame-team.pages.debian.net/benchmarksgame/program/pidigits-java-3.html
      final class pidigits extends Java_GMP_Wrapper{
      ...
      class Java_GMP_Wrapper{
          static {
              System.loadLibrary("Java_GMP_Wrapper");
          }
          final static native long allocate_mpz_t();
          final static native void mpz_add(long sum_Pointer, long augend_Pointer, long addend_Pointer);
          final static native void mpz_addmul_ui(long sum_Pointer, long multiplier_Pointer, long multiplicand);
          final static native int mpz_cmp(long first_Number_Pointer, long second_Number_Pointer);


      Жаба-отребье, как и всякое другое отребье не может ничего родить.
      Оно может только воровать, врать и соревноваться с другими инвалидами.

      И вот на основе таких примеров с прямыми вызовами ворованных Сишных либ, потом делаются заявления о энегроэффективности и пирфомансе ${govno_lang_name}.
      Ответить
    • И какой пример я не щёлкал, везде было одно и то же:
      https://benchmarksgame-team.pages.debian.net/benchmarksgame/program/pidigits-node-5.html
      const MPZ = require('mpzjs');
      
      mpzjs
      Arbitrary precision integral arithmetic for node.js. Based on node-bigint
      This library wraps around libgmp's integer functions to perform infinite-precision arithmetic. It can be used with worker threads.
      
      https://benchmarksgame-team.pages.debian.net/benchmarksgame/program/pidigits-sbcl-3.html
      #+sbcl (require :sb-gmp)		; GMP disabled when commenting out

      При этом очевидно, что с простым «Си» они не могут соревноваться даже делая сишные вызовы.
      https://benchmarksgame-team.pages.debian.net/benchmarksgame/program/pidigits-perl-2.html
      # Leverage GMP like all the other languages 
      require 'gmp'

      Перловцы прямо так и написали.
      Ответить
      • Write once, use everywhere
        Ответить
      • А как сделали в «OCaml», в «FPC» и в «GNAT»?

        В «FPC» я даже встречал честные попытки перевода гнутых библиотек (правда, переводили только те библиотеки, в которых кода немного).
        Ответить
        • Прошу обратить внимание: питузы даже комментарии и названия пельменных друг у друга воруют.

          «OCaml»
          https://benchmarksgame-team.pages.debian.net/benchmarksgame/program/pidigits-ocaml-7.html
          let extract_digit =
            let tmp1 : Mpz.m Mpz.tt = Mpz.init () in
            let tmp2 : Mpz.m Mpz.tt = Mpz.init () in
            fun (num,den,acc) nth ->
             (* joggling between tmp1 and tmp2,
                so that GMP does not use temporary buffers *)
              Mpz.mul_si tmp1 num nth;
              Mpz.add tmp2 acc tmp1;
              Mpz.tdiv_q tmp1 tmp2 den;
              Mpz.get_int tmp1 (* (nth * num + acc) / den |> to_int *)



          «FPC»
          https://benchmarksgame-team.pages.debian.net/benchmarksgame/program/pidigits-fpascal-3.html
          Uses GMP;
          ...
            Begin
              // joggling between tmp1 and tmp2, so GMP don't have to use temp buffers
              mpz_mul_ui(tmp1, num, nth);
              mpz_add(tmp2, tmp1, acc);
              mpz_tdiv_q(tmp1, tmp2, den);

          «GNAT»
          https://benchmarksgame-team.pages.debian.net/benchmarksgame/program/pidigits-gnat-2.html

          package GMP_Mini is
            	Print_String : constant String := ASCII.HT & ":%d" & ASCII.LF & ASCII.NUL;
          
              type mp_limb_t is new Interfaces.C.unsigned;
              type mp_ptr is access mp_limb_t;
          
              type mpz_t is record
                mp_alloc, mp_size : Interfaces.C.int;
                mp_d    : mp_ptr;
              end record;
          
              procedure mpz_init (Dest: out mpz_t) with Inline=>True;
              pragma Import(C, mpz_init, "__gmpz_init");
          Ответить
          • Бенчмарки, возможно, один питуз писал, поэтому и выглядит, как под копирку.
            Ответить
            • > возможно, один питуз писал, поэтому и выглядит, как под копирку

              А вот и нет.
              GNAT 
              --  Contributed by Brian Kolden
              --  gmp headers by Karl-Michael Schindler and Brian Kolden
              --  Port of Mr Ledrug's pidigits
              --  Fixed by johnisgood
              
              OCAML
               * contributed by Gabriel Scherer with GMP advice from Guillaume Melquiond
              
              Rust
              //! Contributed by TeXitoi
              //! Contributed by Ryohei Machida

              Бездарная мразь только что и может: воровать друг у друга и кукарекать.
              Ответить
          • Какой багор )))

            Реально ни одного языка с альтернативной реализацией?

            С другой стороны да, с нуля GMP не выебать. И авторы gmp будут очень рады, если кто-то напишет быстрее: значит ещё есть куда оптимизировать.
            Ответить
            • > Реально ни одного языка с альтернативной реализацией?

              Ну там есть примеры в самом низу.

              Йажа за 7 секунд (против Сишной секунды).

              Но кто туда будет листать? Смотрят же обычно самое лучшее время для ${lang_name}.

              Я просто удивился тому что потом результаты такого вот «сравнения языков» используют в пропагандистских методичках для сектантов и питухов.
              Ответить
              • Т.е. джава оказалась самой честной из всех и не зассала реально протестировать свой конпелятор и VM, а не сишку?
                Ответить
                • Нет, там есть честные реализации и на других языках. Я всё не переклацывал, но внизу есть и честные Хаскель, Govno, Питон, Нода.

                  Причём честные Хаскел и Govno умудрились обогнать Ruby и Perl
                  https://benchmarksgame-team.pages.debian.net/benchmarksgame/program/pidigits-ruby-5.html
                  https://benchmarksgame-team.pages.debian.net/benchmarksgame/program/pidigits-perl-4.html

                  Которые использовали GMP, и всё-равно позорно слили
                  # Leverage GMP like all the other languages 
                  require 'gmp'


                  Просто для пропаганды берут сверху.
                  Ответить
                • Среди честных реализаций лидирует Julia, Haskell и Govno

                  При этом они сливают Сишке в 3-4 раза (что на самом деле очень достойно).

                  Ибо честная Йажа сливает тюнингованой либе в 12 раз, а FPC в 25 )))

                  «Julia»
                  # contributed by Jarret Revels
                  # based on Mario Pernici Python's program
                  
                  using Printf
                  
                  function pidigits(N::Int)
                      i = k = ns = 0
                      k1 = 1
                      n,a,d,t,u = map(BigInt,(1,0,1,0,0))
                  
                      while true
                          k += 1
                          t = n << 1
                          n *= k
                          a += t
                          k1 += 2
                          a *= k1
                          d *= k1
                  
                          if a >= n
                              t,u = divrem(n*3 +a, d)
                              u += n
                              if d > u
                                  ns = ns*10 + t
                                  i += 1
                                  if mod(i,10) == 0
                                      @printf("%010d\t:%d\n", ns, i)
                                      if i >= N
                                          return ns
                                      end
                                      ns = 0
                                  end
                                  a -= d*t
                                  a *= 10
                                  n *= 10
                  
                              end
                          end
                      end
                  end
                  
                  n = parse(Int,ARGS[1])
                  pidigits(n)
                  Ответить
                  • ну а шо ж, Julia это ж язык для ма-те-ма-ти-ков

                    никто не хочет пофорсить, кстати?
                    Ответить
                    • Хорошая вещь. И синтаксис приятный, не тошнотворный как у дrustни.

                      Он в других числодробильных бенчах достойно выступает на пару с Фортраном.

                      Причём они, не читеря, там обгоняют некоторые примеры на С/C++/Rust с SSE-интринсиками (!).
                      Ответить
                      • есть и такое мнение

                        https://www.zverovich.net/2016/05/13/giving-up-on-julia.html

                        уже приносил когда-то
                        Ответить
                        • По ссылке крестух жалуется на время конпеляции JITом. Крестух, Карл!

                          К тому же она Гомоиконна.
                          Ответить
                      • кстати, в Джулии индекс массива с 1
                        Ответить
                        • Это Г вроде давно починили

                          https://github.com/JuliaLang/julia/pull/33946

                          > индекс массива с 1
                          Ну мать-мать-ики же.
                          Ответить
                      • Отдельные интринсики в ЯВУ зачастую прироста не дают, потому что нужно тратить время на копирование данных.

                        С MMX вообще жопа была: инструкции MMX использовали те же регистры, что и инструкции для плавающего питуха, поэтому там ещё нужно было тратить время на переключение режима работы, чтобы данные не распитушило.

                        Реальный прирост скорости можно было получить, только если пишешь большой кусок кода целиком этими инструкциями.
                        Ответить
                        • А сейчас конпеляторы под х64 и сопроцессор то не юзают... SSE намного удачнее получился.
                          Ответить
                          • > конпеляторы под х64 и сопроцессор то не юзают... SSE намного удачнее получился

                            Помню Царь лютовал что это говно, и надо юзать стековый FPU.
                            Ответить
                            • Царь был против любого плавающего питуха, хоть аппаратного, хоть мумулируемого.

                              Царь был за числа с фиксированным разделителем (в идеале вообще за целых питухов).
                              Ответить
                              • Так, да не так:

                                https://govnokod.ru/13422#comment188577

                                «Я могу писать быстрее и лучше на сишке - мне удобней. Мне для этого не надо как рядовому питушку осиливать Сишку.

                                Всё должно отражать всё - если твоей конпелятор написан как говно - он и оптимизировать будет как говно. И да, оптимизации не нужны я уже не помню где был тред, помоему на лоре.

                                Вобще для моего мегаязыка оптимизации не нужны, ибо оптимизации нужны для питухов - там будет удобная ручная предсказуемость, как в ассемблере.

                                В место питушских переменных - там буду переменные, который на самом деле по умолчанию безымянные регистры. Явный их биндинг на имена, явный ялиасинг. Никаких стеков и прочей ереси.

                                Никаких автовекторизаций циклов( которые в 50% дают деградацию, допустим гцц(и все другие конпеляторы) по умолчанию вместо стекового фпу года гинерят ссе код, который медленее фпушного и теряют 10-30% производительности.
                                »


                                Правда что он имел ввиду я честно говоря не понял.
                                Ответить
                                • > Всё должно отражать всё

                                  https://xsport.ua/upload/news-photos/14-09-2017-ao/a0YpIcWI.jpg
                                  Ответить
                                  • А мне зашёл вот этот царский коан.

                                    > Никаких стеков и прочей ереси.

                                    > по умолчанию вместо стекового фпу года гинерят ссе код, который медленее
                                    Ответить
                                    • Сначала жертве внушают, что стек — это ересь.

                                      Потом жертве внушают, что «SSE» хуже пидораса стека.

                                      Потом предлагают сопоставить эти два тезиса.
                                      Ответить
                            • «Патамучто это плавающий питух, который априори говно. И чем вы быстрее это поймёте, чем будет лучше.»

                              https://govnokod.ru/13189#comment182595
                              Ответить
                              • «Естественно твоя софтравная эмуляция флоатов( ок, на 90%) будет тормазней фпу, да и никому она не упёрлась.»

                                https://govnokod.ru/13180#comment181435
                                Ответить
                • Haskell
                  -- The Computer Language Benchmarks Game
                  -- https://salsa.debian.org/benchmarksgame-team/benchmarksgame/
                  -- contributed by Bryan O'Sullivan
                  -- modified by Eugene Kirpichov: pidgits only generates
                  -- the result string instead of printing it. For some
                  -- reason, this gives a speedup.
                  -- modified by W. Gordon Goodsman to do two divisions
                  -- as per the new task requirements.
                  -- further modified by W. Gordon Goodsman to reduce the memory leak
                  -- caused by excess laziness in computing the output string before output.
                  
                  import System.Environment
                  
                  pidgits n = (1,9) % (0 # (1,0,1)) where
                   (i,k)%(d:ds')
                    | i <= n = putStr (show d ++
                                 (if k<=0 then "\t:" ++ show i ++ "\n" else "")) >> (j,m)%ds'
                    | True = if k<9 then putStrLn (replicate k ' ' ++ "\t:" ++ show n)
                             else putStr ""
                    where j = i + 1; m = if k<=0 then 9 else k - 1
                   j # s | n>a || q/=r = k # t
                         | True = q : k # (n*10,(a-(q*d))*10,d) -- inline eliminateDigit
                    where k = j+1; t@(n,a,d)=k&s; q=3$t; r=4$t -- two calls to extractDigit
                   c$(n,a,d) = (c*n+a)`div`d -- extractDigit
                   j&(n,a,d) = (n*j,(a+n*2)*y,d*y) where y=(j*2+1) -- nextDigit
                  
                  main = pidgits.read.head =<< getArgs

                  Не знал что в «Хаскелл» возможны утечки памяти.
                  Ответить
                  • > утечки

                    Это не утечки, а OOM'ы скорее. Вечная проблема ленивых вычислений -- или стек порвётся или куча.
                    Ответить
                  • > Не знал что в «Хаскелл» возможны утечки памяти.
                    foldl (+) 0 list -- порвали кучу
                    foldr (+) 0 list -- порвали стек
                    folrl' (+) 0 list -- спрятано в либу, чтобы потроллить ньюфагов и создать иллюзию джвух стульев
                    Учти, что плюсик -- строгая функция, для ленивых функций эффекты будут другие...
                    Ответить
                    • Паррррррвали парус, каюсь, каюсь...
                      Ответить
    • Какой багор )))

      Но как потенциальному пользователю языка мне приятно осознавать, что у меня будет шанс подключить сиштушню и работать с ней через удобный синтаксис более высокоуровневого языка.
      Ответить
      • Тогда получим очередной Питон, прибитый Сишными гвоздями к платформе.

        И переносимость/надёжность кода падает до переносимости и надёжности Сишки.

        Нету в винде libgmp — пердолься как Сёма, собирай. Проси на ГК чтобы тебе сделали репу бинарными пакетами под XP.
        Ответить
        • > надёжности Сишки

          Ни математического доказательства корректности, ни bounds checking...

          > переносимости

          Даже хвалёную сборку нативных образов в Дотнете использовать не можем (защитники Дотнета кукарекают, что он на каждом процессоре генерирует оптимальный для него код), потому что используем готовый бинарник, полученный из сишки, оптимизированный под неизвестный процессор.
          Ответить
    • Ну кто постит таблицы без заголовков?!
      Ответить

    Добавить комментарий