in Computing and stuff

I’ve got the need for(;;); speed

И така, тестваме колко бързи върти for(;;)-a.
Спорим, дали е пренебрежимо еднакво бърз в скриптов език  и С++.
Не е ясно до колко резултатите са адекватни, прилагам и код.
C++ code:

На екшън скрипта му давам 3 секунди спокойствие преди да почне да смята. По е честно.

В Python3 има нещо гнило.

PHP

C++ 320ms
ActionScript3 582ms (1.8 times)
PHP5 4584ms (14.32 times)
Python3 12522ms (39.1 times)

Изглежда не бях прав. C++ -a е много по-бърз дори и от втория.

Write a Comment

Comment


*

  1. Едно време като решавах задачите от project Euler, понеже все от различни компове ставаше и на един имах една среда на други друга и забелязвах фрапиращи разлики при елементарни математически операции между С++ и AS3, доста по-големи от тези които ти си документирал. Все пак мерси за поста

  2. 1. Допуснал си стандартната грешката на хората, които искат да сравняват няколко езика/бази данни/двигатели/уеб сървъри/косачки. Не разбират добре всички участници на теста си, а само няколко. За останлите имат само някаква смътна представа как да ги ползват и, че уж могат да вършат същите неща като тези, с които са запознати. И тъй като съм добра душа и разбирам нещичко от питон, ще ти кажа къде ти е грешката там. Както сам си предположил, има грешка:

    Реда for i in range(0, 100000000) всъщност означава “създай ми чисто нов масив от 1e8 елемента (memory allocation – тежко), запълни го с елементите от 0 до 1е8-1 (1e8 операции), след това ми създай итератор, с който мога да итерирам през този масив и викай метода за нов елемент на този итератор, докато не хвърли ексепшън за край на итерацията”. Както виждаш това е доста повече от колкото пише в останалите примери, където никъде не се създават и пълнят масиви преди. Това, което си написал в примера, е приблизително еквивалентно на това (добавено в c++ примера ти) – https://gist.github.com/997849 . Приблизително, защото няма exception handling като в python-a.

    За да постигнеш това, което си написал в другите примери, python-ския ти трябва да бъде променен на for i in xrange(1e8): . Това тук направо създава итератор, койго ще ти дава числа до 1e8-1 без предварително да създава масиви. Този итератор много прилича на обикновенния for – пази си една стойност, инкрементира я и проверява дали не е стигнал максимума.

    2. Сравняването на езици, които се компилират (C++ и ActionScript) с такива, които се интерпретират (Python и PHP), когато става въпрос за скорост, е просто безмислено. Както е безмислено да сравняваш скороста между камион, пълен с крави, и спортна кола – и двете могат да се движат по пътя, и двете могат да ускоряват и спират, но са направени за съвсем различни неща и работят по съвсем различен начин.

    Проблема идва от това, че компилаторите създават bytecode, който в крайна сметка е направо инструкции към процесора. Интерпретаторите всеки път четат кода, анализират го, създават bytecode и го пускат на процесора. При това на веднъж, а инструкция по инструкция. За да си го представиш по лесно, те всеки път правят по – бавна версия на g++ mycode.cpp -o output && ./output. Последното изречение не е вярно, но илюстрира добре какво се опитвам да обясня, надявам се. Така в крайна сметка твоите таймери за интерпретируемите езици показват времето за цялото нещо (g++ .. && ./ouput), докато за компилируемите показват само времто за ./output.

    Ако искаш истинско сравнение между тях, можеш да опиташ да ги компилираш интерпретируемите. За питон – PyPy ( http://pypy.org/ ) – интерпретатор на питон с JIT. Все още е по – малко от компилиране, но е доста близо. Напълно съвместим е със стандартния на python foundation, който идва в операционните системи. За PHP – *аз* не знам нищо, което да го докарава до истински bytecode.

    Иии… и аз обичам числа, затова ще си защитавам питоня. Моето сравнение на твоята оригинална C++ програма и python-ската с xrange през pypy показва *средни* резултати: 320ms за C++, 650ms за Python. Не мога да го изпробвам с ActionScript, защото изобщо не съм го хващал до сега и вероятно ще направя грешки, подобни на твоите 🙂

    3. Когато правиш сравнения, като твоите, не може да пуснеш веднъж програмата и да запишеш резултата. Трябва да я пуснеш много (хиляди?) пъти и да направиш средно време. Има голями разлики в единичните пускания, както ще забележиш тук: https://gist.github.com/997831 .

    4. Няколко други дребн(ави)и забележки:
    * microtime, не $microtime.
    * е грешно на толкова много нива! Сравнително важно измежду тях е това, че интерпретатора никога не би възприел това между тях като код за изпълнение.
    * скоба в int main.

    Заключение: Опитвам се да те убедя, че а) сравняваш ябълки и круши и б) скороста който и да е език рядко е функция на самия език. Значение обикновенно имат интерпретаторите/компилаторите.

  3. Ах ! Липсваше ми такава критика тука 🙂 Айде в твой стил !

    За пайтъна още след като видях този резултат, прегледах разбира се наляво-надясно и видях това, което си писал. И казах, че не му е чиста работата. Според мене почти всички ползват там фор-а, който аз съм показал, теста не е стерилен 🙂
    2. Това за байт-ала-бала знаем, все пак БЛАГОдарности, че го отбеляза ;]. Сравнението обаче не знам как реши, че е безсмислено .. както съм казал в началото на темата, не спорим кое ще е по-бързо (и защо), а дали резултите ще са пренебрежимо близки 🙂
    Мога да ти дам и пример в кои ситуации отговора на този въпрос може да ти е важен.
    3. Не я пусках хиляди пъти, но ~10 за всеки език. Резултатите се разминаха с под 1% 🙂
    4. Това е мотика за ламери 😀
    Като заключение, аз няма да издавам статия с тея 4 фор-а, просто на Фил алгоритъма за фигурите ще го напишем в С++-а 🙂 .. но все пак, това са риъл-лайф (поне риъл-Благо-лайф) примери ..

  4. Пак съм тук!

    1. Обиждаш python хората. Опитваш се да ме убедиш, че някой разумен от нас би решил да напише това, докато е буден. Това не е вярно.

    2. Всъщност за собствените си цели най – добри съдии сте си вие, наистина. Но това сравнение ми прилича на доказателство, че слънцето утре ще изгрее. Да, вероятно доказателството ще е вярно, но какво от това?

    3. Никога на десктоп машината си не съм имал амплитуда от 1-2%. Винаги е била 10-20. Май тия макове са много хубави. Ще взема да си взема един хах 🙂 Така и така тоя gnome 3 ще срути всичко.

  5. бръм, бръм
    1. На един от най-свестните курсове в университета (който дори посещавах(!)) – пайтънския, тази твоята пайтънска джаджа не се спомена => масите не знаят за нея. Тествал съм ‘the usual’ for-циклите.
    2. Аз да не съм казал, чe някой от езиците тука е по-добър от друг ?! Това е просто времето, за което ми се е завъртял един фор. Няма нужда да си адвокат, на нещо което няма нужда от такъв.
    3. http://www.apple.com/getamac

  6. Улииииииииий, о0 Дойчо како напрай ти уа…тва вече не е на Благо блога, това е на Дойчо блога, и Благо все едно ти е хостинга :X