Google Go vs. Си
Ребята на работе
Я подключился и написал пример на Google Go:
package main
import "fmt"
func main() {
x := []int{2}
for i := 3; i < 200000; i += 2 {
simple := true
for _, j := range x {
if i % j == 0 {
simple = false
break
}
}
if simple {
x = append(x, i)
}
}
fmt.Println(x)
}Запускалось всё
Python — 25,95 секунды Perl — 22,96 секунды PHP — 21 секунда Objective C — 9,40 секунды JavaScript (V8) — 4,73 секунды Java — 1,94 секунды Си — 0.95 секунды Google Go — 0,71 секунды.
Особенно меня поразили «Гоу» и JavaScript.
Комментарии 86
Я не понимаю причём тут новые тренды. Я проверил свой блог на браузерах с сайта BrowserShots ( http://browsershots.org/ ), там везде (кроме Dillo) сайт отображается нормально.
что-то не отображается (и лучше в подходящем для этого месте — заметке, где я написал про JS+CSS), я попробую поправить.
Если ты мне напишешь (и без этого хамства) в каком браузере
буква «К» в слове «несолько» пропущена :)
python 2.6.1 http://pastebin.com/v6WR4CpE
других у меня пока нет, попрошу ребят, которые писали, сюда положить
Зачем браузеры? Можно поставить V8 (brew install v8)
Я программу уже написал:
V8 version 3.4.6.2 http://pastebin.com/tdXTwv0s
Но парень, у которого «эталонный» Мак (на котором мы всё пускали), едет домой, приедет, запустит :)
6g.
Исправленный скрипт отрабатывает 23 секунду, то есть быстрее чем на Python.
http://pastebin.com/TLnpZXgp
Сергей, а вы обладатель того самого эталонного ноутбука, на котором проводились тесты?
Комментарий для blog.chaotics.org:
Спасибо! Не я писал этот скрипт, правда, я проверял, но взгляд за break не зацепился. Попрошу обладателя эталонного ноутбука перезапустить тест.
Ну, пустить его под Маком, кажется, нетривиальная задача. Да и эксперимент будет нечестным — для C# это чужеродная среда.
http://shootout.alioth.debian.org/u32/benc … 6lang2=gcc
Комментарий для Александр Карпинский:
Должен бы. Странно почему тут обогнал.
Версия на js неожиданно быстрее всего выполняется в Сафари, 2,8 сек. Потом ФФ, за 3,3 сек. В Опере, Хроме и ИЕ примерно поровну — 4,4. Хорошо браузеры прокачались в числодробилках :)
Завтра посмотрим как выполняется версия на JS под нашим эталонным Маком :) «Опера» последняя бралась? 11.50RC1?
Да.
Выкладываю все исходники!
Plain C: http://pastie.textmate.org/private/zpslsfm … 0u3tsgkx5w
Google Go: http://pastie.textmate.org/private/5o7zhky … jtq3dx253g
Java: http://pastie.textmate.org/private/hmjjn5m … axwkpnmxxq
JavaScript: http://pastie.textmate.org/private/v287gwf … wpcl9d9qda
ObjC: http://pastie.textmate.org/private/mvb25krmxvu1amegzclq
PHP: http://pastie.textmate.org/private/pq3ss3kxgbcvcktc0mug
Perl: http://pastie.textmate.org/private/bbpcwcj5ccnk7ircjifa
Python: http://pastie.textmate.org/private/rjqtcdm … rjjw5bxmyg
Исправленная версия на перле работала 22.96 сек (а я собственно обладатель эталонного макбука) — спасибо Сергею))
JavaScript(V8) — 4.73 сек.
ObjC — 9.40, но это конечно стеб. Я ее написал просто для кучи, разумеется можно было просто скормить Plain C версию Xcode.
JS добавил, несправедливость с Перлом пофиксил.
Кстати, у Володи есть версия на C++, завтра и её надо будет потестировать, но там
И таки да — даже в 2011 году php не может нормально обрабатывать циклы =(
Положите на pastebin.com ваш вариант, Миша запустит как увидит комментарий.
http://pastie.textmate.org/private/eovr5vh … up4qabp63a
Оптимизация ни к чему. Нужно переписать код как есть.
Не удобно с айфона набирать )
Вариант Сергея, кстати, лучше. Но не думаю, что сильно поможет, если честно.
Вы про кого говорите? Кто додумался? Я написал: «правда, первая реализация получилась неотимальная и с некритичной ошибкой, но мы решили дословно повторить этот вариант на всех остальных языках». Читайте внимательно, пожалуйста.
И, кстати, вам не всё равно какой абстрактный алгоритм является пузомеркой? Вы что, верите, что стоит реализовать правильный алгоритм и, скажем, Perl выйдет на первое место или что? Или вы эти реализации планируете у себя в коде использовать?
C++ будет, а Фортран у нас не знает никто.
А на фортране я писал
Комментарий для mixael:
Ну, это читерство — так оптимизировать, на всех языках можно так сделать :) Испытай лучше вот этот: http://pastebin.com/zHZxrw05 А С++ ты у Володи Москвы не взял?
http://r.research.att.com/tools/ Он есть в brew.
со скуки (в интернете
java (замер времени через time): 1.44s
java (замер времени в коде чтоб исключить время компиляции в байткод,
java (замер времени в коде и убран вывод на экран): 0.74s
plain c (замер через time): 0.89s
plain c (замер через time и убран вывод на экран): 0.88s
несколько неожиданно если судить по скорости работы только алгоритма
Холодный запуск. Утилита time.
Утилита time.
Зачем нужно убирать время компиляции и убирать вывод на экран, если первое всё равно чувствительно для пользователя, а второе есть в задаче?
Да кому оно интересно, голое время работы алгоритма?
Комментарий для Евгения Степанищева:
Первое чуствительно для пользователя, если он перед каждым запуском функции компилирует в байткод. Это может быть и не так, если у него процесс в памяти висит, и выполняет много задач подряд, а не одну.
Возможно потому, что если ваша задача выполняется не 0.5 секунды, а хотя бы минуту, то время компиляции будет вносить значительно меньшую погрешность.
http://pastie.textmate.org/private/xhet0zu … 3yhfyic6ga
у меня с С разницы по скорости 0 (gcc 4.4.5)
там в PHP основной выигрыш от замены for на foreach (PHP что — то долго элемент массива по индексу берёт, ручной count не сильно помогает) а continue — это так уж, меж делом :)
Комментарий для fulc.ru:
Эту разницу я, конечно же, понимаю.
А почему не логично не учитывать время компиляции? Почему мы не учитываем время работы gcc в замерах производительности c?
Комментарий для fulc.ru:
Потому что запускаемой программой на этих языках считаются разные вещи. На компилируемых — скомпилированная, на интерпретируемых — исходный код.
Комментарий для Евгения Степанищева:
Поскольку я вижу в самой заметке:
Чтобы померить время холодного старта достаточно hello world, к чему городить огород с алгоритмом? Только вот к языкам программирования это не имеет ни малейшего отношения. И, кстати, подсчет времени в коде я углядел в php версии.По-моему кто-то что-то недоговаривает :)
Опять же:
Не думаю что вывод на экран имеет отношение к поиску простых чисел. Если бы выбрали для сравнения вывод n чисел на экран тогда другое дело.
PS: разумеется компиляция не в байткод а из него.
Комментарий для Евгения Степанищева:
Хотя, если
тогда конечно да. Мерить языки программирования временем старта интерпретатора/виртуальной машины и компиляции/интерпретации куда как увлекательнее. Особенно в сравнении с теми языками где оных нет.
Комментарий для artemp.pip.verisignlabs.com:
Понятно, что интерпретируемые будут медленнее, вопрос не в этом, интересно насколько. При этом мы видим, что Java и JavaScript — это секунды, а остальные интерпретаторы — десятки секунд.
Комментарий для artemp.pip.verisignlabs.com:
Не нужно относиться к этому как к серьёзному исследованию. Нам хотелось немного повеселиться, заодно посмотреть насколько различается холодное время выполнения разных языков.
Некоторыми комментаторам предлагает исключить время старта виртуальной машины/разбора кода и прочее. Странно, но никто не предложил сделать то же со скомпилированными программами.
У них тоже есть время старта (чтение с диска), инициализации (заполнение различных значений, например, переменных окружения), загрузка библиотек (например, моя программа makecorner использует libgd.2.0.0.dylib и libSystem.B.dylib, те в свою очередь используют ещё
Комментарий для Евгения Степанищева:
нас хлебом не корми, дай копья поломать :)
никакой дискриминации, согласен с предложением.всё-таки я против вывода на экран :) )
более того, полагаю что выигрыш во времени у java версии по сравнению с си в моем сравнении вероятно именно этим и обусловлен. я действительно был удивлен результатами. к сожалению я не на короткой ноге с си, поэтому не добавил подсчет времени в код си версии. но с удовольствием бы взглянул на результаты сравнения голых алгоритмов (и
Комментарий для artemp.pip.verisignlabs.com:
Ну так за чем дело встало?Компиляторы-то для всех платформ существуют :)
По умолчанию система может произвольно менять частоту. Допустим, Go исполнялся на 2.5 GHz, а C — на 2.
Не могу сказать. Но Миша, который тестировал, знатный маковод. Спрошу у него как увижу на работе или в джаббере.
Вообще, мы программы подряд пускали и несколько раз вперемешку (не могли глазам поверить), поэтому вряд ли.
Никаких дополнительных опций оптимизации? Тогда это скорее проблема gcc 4.2. Не думаю, что дело в ОС (у меня GNU/Linux).
Никаких, да.
Комментарий для Евгения Степанищева:
Можно и не компилировать самому:
— JavaScript (Rhino): http://ideone.com/Z3e1T — время: 2.53 s, память: 214016 kB
— JavaScript (SpiderMonkey): http://ideone.com/E62qk — время: 1.08 s, память: 5076 kB
— Perl: http://ideone.com/sBs9y — время: 0.34 s, память: 4732 kB
— С: http://ideone.com/7VWx7 — время: 0.04 s, память: 1908 kB
— Go: не запустился (undefined: append)
Я сократил количество итераций до 20000, иначе для некоторых языков время выполнения превышало лимит.
У нихкакой-то очень древний компилятор, поэтому интереса в этом мало :(
Зато другие языки можно сравнить. Вон JavaScript уже не столь хорош.
Тоже ведь неизвестно что там за версия. Ну и V8 лучший из открытых.
Комментарий для Евгения Степанищева:
Почему неизвестно? Версия указана.
И правда.
На сайте SpiderMonkey версии 1.7, актуальную мне посмотреть не удалось, сайт лежит, но у меня в портах есть 1.8.5
На сайте Rhine версии 1.6.5, актуальная —1.7R3.
По меркам интерпретаторов JS — старьё. :)
Задачи сделать максимально быстро нет. Есть задача повторить тот же алгоритм на разных языках.
тестить желательно на 1.9.2
http://pastebin.com/xHbRKnmk
Сейчас уже не смогу потестить, «эталонная» машина за много сотен километров.
CPython — 12.11 sec
PyPy — 1.266 sec
/trollface
Почему?
Я тут начал изучать Forth и первой программой написал тот же самый алгоритм, чтобы сравнить перфоманс.
http://hastebin.com/raw/fiqigusano
Использовал gforth и сравнивал с вашими программами на си и питоне.
man gforth:
x := []int{2}
for i := 3; i < 200000; i += 2 {
for _, j := range x {
if i%j == 0 {
break
}
}
x = append(x, i)
}
println(x)
Вообще то да, это не решето решето Эратосфена.
Вот мои результаты питона (так как я пишу на нем)
И результаты с Гоу (так как хочу его изучать)
#!/usr/bin/perl
use strict;
my @a = (2);
L: for (my $i = 3; $i