LINUX.ORG.RU

Ушат помоев в сторону крестолюбов

 , , ловите наркомана,


15

14

Восседая в уютненьком кресле с чашечкой сладкого чая, внезапно ощутил приток жопной боли напополам с лирическим настроением и решил излить сию благодать куда руки дотянулись.

Последние 7 лет я пишу сугубо на C, и только под Linux (да, да -std=gnu99 и accept4, dup3, __attribute__((cleanup(dtor))) и прочие приятности, позволяющие сделать волосы шелковистее на 15.5%) и не понимаю, для чего вообще нужен C++? То, что на сишке делается красиво и элегантно, в крестах напоминает соитие парализованных дцпшников (к сожалению, утерял картинку, но именно этот образ всплывает в голове, когда вижу очередную порцию крестолапши).

Давайте посмотрим на типичного C++ разработчика: он использует STL, boost, многие любят Qt (не только для GUI), якобы чтобы «писать кроссплатформенный код». В итоге болезный не знает током ни WinAPI, ни POSIX — ничерта. Он абсолютно не разбирается, как работает целевая система, для которой пишет код! Крестокодер просто не осознает, какой лютый ужас кроется за его любимыми iostream-ами, какое лютое говно лежит в boost::filesystem::path, насколько убого-низкоуровневым является boost::asio в 2016 году.

Только крестораб может эпично обосраться и просадить производительность, забыв передавать по ссылке параметры для «горячих» функций (то есть, просто забыв написать «&» в нужном месте).

Также эти убогие завистливо смотрят на type inference в языках, проектировавшихся не как «C на стероидах», и в ответ начинают лепить template и auto не к месту, от чего код адово пухнет и даже IDE перестает его понимать.

Серьезно, просто прекратите писать на этом языке. В следующий раз, начиная новый проект, выберите java (щютка)/go/swift/rust/c. Прекратите насиловать труп и отравлять зловонием все вокруг!

Перемещено true_admin из talks

★★★★

Последнее исправление: a1batross (всего исправлений: 2)
Ответ на: комментарий от stevejobs

А вот это кто писал, и почему такая разница?

Вот пруфы для миллиарда в одном месте ещё раз:

CL-USER> (time (loop for i from 0 to 1000000000 sum i))
(LOOP FOR I FROM 0 TO 1000000000 SUM I)
took 2,277,193 microseconds (2.277193 seconds) to run.

CL-USER> (time (loop for i fixnum from 0 to 1000000000 sum i fixnum))
(LOOP FOR I FIXNUM FROM 0 TO 1000000000 SUM I FIXNUM)
took 781,171 microseconds (0.781171 seconds) to run.
anonymous
()
Ответ на: комментарий от anonymous

Лох! У меня на Джаве быстрее!

Result: 50000000005000000000
Execution time: 777 microseconds

Код: https://gist.github.com/olegchir/825aef1145ae126e8f1f9aaa2936a70c

Анонимус, учти в следующий раз, что за такие шутки бьют лицо утюгом

stevejobs ★★★★☆
()
Последнее исправление: stevejobs (всего исправлений: 1)
Ответ на: комментарий от stevejobs

Код: https://gist.github.com/olegchir/825aef1145ae126e8f1f9aaa2936a70c

Анонимус, учти в следующий раз, что за такие шутки бьют лицо утюгом

Это не шутки, а суммирование по моим правилам :-) А ты продемонстрировал смену алгоритма :-) Суммируй честно :-)

anonymous
()
Ответ на: комментарий от anonymous

Поэтому я и прошу - предъяви ассемблер того, что тебе собрал твой компилятор. Я уверен что он тоже сменил алгоритм и складывает по гауссу.

Утюг нагревается, юзернейм, снимай штанишки

stevejobs ★★★★☆
()
Ответ на: комментарий от stevejobs

Поэтому я и прошу - предъяви ассемблер того, что тебе собрал твой компилятор. Я уверен что он тоже сменил алгоритм и складывает по гауссу.

Уверен, не уверен, Лисп - высокоуровневый язык :-) По Гауссу там, или не по Гауссу, мне по сараю - это задача компилятора :-) Суть то в том, что тебе пришлось сломать голову, прежде чем до тебя дошло применить метода Гаусса и реализовать его вручную на Java, ты потратил сколько времени? :-) А я на написание loop потратил 5 секунд :-)

Но если тебе нужен ассемблер, на, разбирайся:

    (recover-fn-from-rip)                   ;     [7]
    (testl (% nargs) (% nargs))             ;    [14]
    (jne L221)                              ;    [16]
    (pushq (% rbp))                         ;    [22]
    (movq (% rsp) (% rbp))                  ;    [23]
    (pushq (% save0))                       ;    [26]
    (pushq (% save1))                       ;    [28]
    (xorl (% save0.l) (% save0.l))          ;    [30]
    (xorl (% save1.l) (% save1.l))          ;    [33]
L29
    (movq (% save1) (% arg_y))              ;    [36]
    (movq (% save0) (% arg_z))              ;    [39]
    (movl (% arg_y.l) (% imm0.l))           ;    [42]
    (orl (% arg_z.l) (% imm0.l))            ;    [44]
    (testb ($ 7) (% imm0.b))                ;    [46]
    (jne L70)                               ;    [49]
    (addq (% arg_y) (% arg_z))              ;    [51]
    (jno L84)                               ;    [54]
    (lisp-call  (@ .SPFIX-OVERFLOW))        ;    [61]
    (recover-fn-from-rip)                   ;    [68]
    (jmp L84)                               ;    [75]
L70
    (lisp-call  (@ .SPBUILTIN-PLUS))        ;    [77]
    (recover-fn-from-rip)                   ;    [84]
L84
    (movq (% arg_z) (% save1))              ;    [91]
    (movq (% save0) (% arg_z))              ;    [94]
    (testb ($ 7) (% arg_z.b))               ;    [97]
    (jne L118)                              ;   [101]
    (addq ($ 8) (% arg_z))                  ;   [103]
    (jno L140)                              ;   [107]
    (lisp-call  (@ .SPFIX-OVERFLOW))        ;   [109]
    (recover-fn-from-rip)                   ;   [116]
    (jmp L140)                              ;   [123]
L118
    (movl ($ 8) (% arg_y.l))                ;   [125]
    (lisp-call  (@ .SPBUILTIN-PLUS))        ;   [133]
    (recover-fn-from-rip)                   ;   [140]
L140
    (movq (% arg_z) (% save0))              ;   [147]
    (movq (% save0) (% arg_y))              ;   [150]
    (movq ($ #x1DCD65000) (% arg_z))        ;   [153]
    (testb ($ 7) (% arg_y.b))               ;   [163]
    (jne L173)                              ;   [167]
    (cmpq (% arg_z) (% arg_y))              ;   [169]
    (jle L29)                               ;   [172]
    (jmp L199)                              ;   [178]
L173
    (lisp-call  (@ .SPBUILTIN-GT))          ;   [181]
    (recover-fn-from-rip)                   ;   [188]
    (cmpb ($ 11) (% arg_z.b))               ;   [195]
    (jne L199)                              ;   [199]
    (jmpq L29)                              ;   [201]
L199
    (movq (% save1) (% arg_z))              ;   [206]
    (popq (% save1))                        ;   [209]
    (popq (% save0))                        ;   [211]
    (leaveq)                                ;   [213]
    (retq)                                  ;   [214]
L221
    (uuo-error-wrong-number-of-args)        ;   [228]

anonymous
()
Ответ на: комментарий от stevejobs

Лох, у меня с циклом и на питоне быстрее. RPython:

import time

def main(args):
    start = time.time()
    s = 0
    for i in xrange(1000000001):
        s += i
    end = time.time()
    print(s, end-start)
    return 0

def target(*args):
    return main, None
$ ./test-c
(500000000500000000, 0.000000)

0.000000 микросекунд. А всё потому, что цикл заоптимизировался в одну единственную, простую и красивую инструкцию моего 64-битного процессора: movabs rax,0x6f05b59f17f6500.

anonymous
()
Ответ на: комментарий от anonymous

Может так лучше?

Кложурятина 1.8

user=> (defn sum [n] (* (inc n) (/ n 2)))

user=> (time (sum 1000000000))
"Elapsed time: 0.020544 msecs"
500000000500000000

sbcl 1.3.1

* (defun sum (n) (* (1+ n) (/ n 2)))

SUM
* (time (sum 1000000000))

Evaluation took:
  0.000 seconds of real time
  0.000000 seconds of total run time (0.000000 user, 0.000000 system)
  100.00% CPU
  4,050 processor cycles
  0 bytes consed
  
500000000500000000
Racket v6.3
> (define (sum n) (* (add1 n) (/ n 2)))
> (time (sum 1000000000))
cpu time: 0 real time: 0 gc time: 0
500000000500000000

Hertz ★★★★★
()
Ответ на: комментарий от Hertz

А так ещё лучше :-)

(time 500000000500000000)
500000000500000000
took 5 microseconds (0.000005 seconds) to run.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.