![]() |
Великая битва 4х языков программирования на простейшей задачке
Приветсвую, булкомэны!
Думаю многие хотели бы сделать свой майнкрафт с ГСЧ и крупнопиксельными женщинами. И вот хотелось бы узнать на каком языке это лучше всего делать. Под лучше я понимаю два критерия: - эффективность работы программиста - эффективность работы программы Исходя из первого пункта всякие С/С++ были выкинуты из перечня возможных твердой рукой и без всякого сожаления. Objective C проваливает оба пункта и мы тоже с ним прощаемся. Оставшиеся кандидаты: .NET Framework Java Blitz3D PHP (ради лулзов) Erlang (ради эпичности) |
Ответ: Великая битва 4х языков программирования на простейшей задачке
Итак, задача:
выделяем трехмерный массив целых чисел 512х128х512 есть счетчик, целое число обходим массив, пишем в ячейку значение счетчика, увеличиваем счетчик на единицу. всё. Вот такая ерундовая задачка. На разных языках были написаны тесты. Спасибо таким товарищам: Romanzes'у за вариант на Java Phantom'у за вариант на PHP Randomize'у за вариант на BlitzMAX Все задачки тестировались на ноутбуке с такой конфигурацией: Core i3 2100MHz, 4Gb RAM, Win7 64bit. |
Ответ: Великая битва 4х языков программирования на простейшей задачке
Первым будем мерять производительность старичка Blitz3D, как наиболее близкого обитателям форума.
Код:
allocStart = MilliSecs() Результаты: время выделения памяти под массив: 327 мс время заполнения массива: 716 мс Ну, неплохо для начала. |
Ответ: Великая битва 4х языков программирования на простейшей задачке
теперь потестируем .NET 4 - технологию, отвечающую за скриптинг в движке Unity3D (это не совсем верно, т.к. в Unity используется Mono - аналог .NET Framework)
Код:
using System; время выделения массива: 0 мс время заполения: 187 мс Вот так, старичок Блиц нервно курит в стороне. Всё таки новые технологии явно лучше. Прямо проникаешься производительностью дотнета. |
Ответ: Великая битва 4х языков программирования на простейшей задачке
Следующим пунктом идет Java 7. Технология, стоящая за оригинальным Minecraft.
Код:
package bigarrayjava; время выделения памяти под массив: 265 мс время заполения массива: 41 мс Гордость и величие дотнета померкли и скукожились. Java выигрывает на заполнении массива в более чем 4 раза. Так и хочется спросить, Нотч, почему Майнкрафт так тормозит??? |
Ответ: Великая битва 4х языков программирования на простейшей задачке
|
Ответ: Великая битва 4х языков программирования на простейшей задачке
А у меня на блитз другой результат alloc 76 ms fill 1179 ms это плохо да?
естественно не сравнивая с .NET 4, может ещё что-то в памяти сидит. |
Ответ: Великая битва 4х языков программирования на простейшей задачке
ffinder, может объединить сообщения? Просто сейчас тут понафлудят и будут посты раскидны ажбы как.
|
Ответ: Великая битва 4х языков программирования на простейшей задачке
Настало время ЭПИЧНОЙ ЭПИЧНОСТИ!
На самом деле нет. Я так пошутил. В Эрланге нет изменяемых массивов. Массивы сделаны через деревья. И еще Эрланг это интерпретатор. Поэтому я не стал парится, и просто написал в консоли: Код:
{{StartMega, StartSecs, StartMicro}, VoxelData, {StopMega, StopSecs, StopMicro}} = {now(), [X || X <- lists:seq(0, 512*128*512)], now()}. А самые внимательные заметили, что в названии темы 4 языка, а в списке тестируемых - 5. Как же так? Просто PHP съел гигабайт памяти и вылетел не решив поставленную задачу:-D Вот так, двумя эпически громкими, кхм, ну, пусть будет раскатами грома, закончилась битва языков. |
Ответ: Великая битва 4х языков программирования на простейшей задачке
Вложений: 1
Мой тест на BlitzMax:
PHP код:
Fill: 258ms Машина для теста: AMD Athlon 1.81GHz 1Gb RAM Windows 7 x86 |
Ответ: Великая битва 4х языков программирования на простейшей задачке
тестовая программа Randomize'а дает такой результат:
выделение памяти: 45 мс заполнение массива: 75 мс |
Ответ: Великая битва 4х языков программирования на простейшей задачке
В .Net, используй в циклах ++x а не x++.
Также, используй StopWatch для корректного замера времени на операцию. И используй Jagged Array, он будет где-то в 2-3 раза быстрее. |
Ответ: Великая битва 4х языков программирования на простейшей задачке
Цитата:
В данном конкретном случае можно немного оптимизировать :) Код:
Local Time1% = MilliSecs() ЗЫ Твой вариант: аллокация ~244мс, заполнение ~5740мс проц P-4 Prescott 3Ghz ЗЫЫ Да и еще, помоему для minecraft-like игр юзать 3д массивы - чистое нубство :) |
Ответ: Великая битва 4х языков программирования на простейшей задачке
Цитата:
Цитата:
|
Ответ: Великая битва 4х языков программирования на простейшей задачке
Цитата:
Код:
Const Width% = 512 Цитата:
Цитата:
Можно использовать octree или BVH, ибо 3д массив не адаптивен, на пустых пространствах много памяти тратится бесполезно. Память выделять из пула. Хранить смещения вместо указателей, это немного уменьшит узлы дерева. Дерево обновлять локально - скользить вверх\вниз по веткам. Периодически перестраивать дерево уменьшая фрагментацию памяти, сложно конечно, но думаю возможно. Использовать выравнивание памяти. Попытать автора вот этой штуки :-) Еще что-нибудь, надо подумать :-) ЗЫ Sparse voxel octree заюзать *trollface* А вообще я не пойму смысла такого "бенчмарка", тут практически нечего тестировать, какой нафиг запись в массив, напишите реализацию какого-нить достаточно сложного мат. алгоритма и на нем тестируйте, еще бы сложение двух переменных потестировали :-D |
Ответ: Великая битва 4х языков программирования на простейшей задачке
Цитата:
alloc 0 ms fill 247 ms Платон Александрович спас положение!:super: |
Ответ: Великая битва 4х языков программирования на простейшей задачке
Цитата:
|
Ответ: Великая битва 4х языков программирования на простейшей задачке
Вложений: 1
эффективность работы программиста (когда дело касается не формошлепства) на С++ вещь спорная. такчто я вчеркнул его назад.
Код:
#include <iostream> fill - 17 |
Ответ: Великая битва 4х языков программирования на простейшей задачке
Вариант HolyDel'а выдает:
выделение памяти под массив: 0 мс время заполнения массива: 21 мс Плюсы как всегда дают всем просраться грубой силой;) |
Ответ: Великая битва 4х языков программирования на простейшей задачке
Цитата:
Цитата:
да и меряем технологии на одинаковой задаче, по возможности. |
Ответ: Великая битва 4х языков программирования на простейшей задачке
Цитата:
перемерял, получилось: выделение: 50 мс заполнение: 678 мс Цитата:
Цитата:
Цитата:
а если серьезно - то вы зацикливаетесь на хранении и сжатии данных, из расчета, что они будут статичными. если же представить себе мир с гидро и аэродинамикой, хотя бы примитивной, то всякие разреженные деревья не подходят. |
Ответ: Великая битва 4х языков программирования на простейшей задачке
Цитата:
Цитата:
Цитата:
Цитата:
Цитата:
|
Ответ: Великая битва 4х языков программирования на простейшей задачке
Вложений: 1
|
Ответ: Великая битва 4х языков программирования на простейшей задачке
Вложений: 1
Чисто ради интереса перевел вариант HolyDel'a на Ди:
Код:
import std.c.windows.windows : GetTickCount; У меня результаты странные: Цитата:
|
Ответ: Великая битва 4х языков программирования на простейшей задачке
Цитата:
Total filling time: 938 ms Average fill time per step: 46 ms |
Ответ: Великая битва 4х языков программирования на простейшей задачке
allocate 125
fill 84 выделение памяти действительно очень долгое. странно. |
Ответ: Великая битва 4х языков программирования на простейшей задачке
Вариант HolyDel'a на шарпе:
PHP код:
allocate time: 1,0001 fill time: 43,00246 |
Ответ: Великая битва 4х языков программирования на простейшей задачке
Цитата:
упд. теория подтвердилась практикой: Код:
using System; у меня вариант pax-а дает 2 на аллокацию и 176 на заливку. |
Ответ: Великая битва 4х языков программирования на простейшей задачке
А если на ассемблере попробовать? Я понимаю, что про 1й пункт можно забыть, но все же.
|
Ответ: Великая битва 4х языков программирования на простейшей задачке
Цитата:
|
Ответ: Великая битва 4х языков программирования на простейшей задачке
Вложений: 1
Код:
import std.c.windows.windows : GetTickCount; Результаты чуток получше, но, увы... Цитата:
|
Ответ: Великая битва 4х языков программирования на простейшей задачке
Сделал 3 теста на C#, первый вариант, затем тот что PAX'а, и потом jagged от HolyDel'а.
В общем результаты такие: Multidimensional: Allocate: 1.6ms Fill: 712.95ms Get(65536 times): 1.03ms Flattened: Allocate: 1.6ms Fill: 223.68ms Get(65536 times): 0.62ms Jagged: Allocate: 448.18ms Fill: 296.11ms Get(65536 times): 0.46ms Intel Pentium 4 CPU 3.00Ghz (2 CPUs) Получается, работа в общем с Flatenned на C# в основном самый быстрый способ. Но с Jagged, если использовать статический массив, то доступ к данным будет быстрее. Учитывая постоянный доступ, если он будет необходим, лучше всё таки использовать именно Jagged массив. А если нужен динамичный, то Flatten. Обычный мультиразмерный - естественно идёт мимо. |
Ответ: Великая битва 4х языков программирования на простейшей задачке
и намного ты быстрее напишешь, чем cl.exe нагенерит?
Код:
; 23 : ++counter; |
Ответ: Великая битва 4х языков программирования на простейшей задачке
Вложений: 1
Цитата:
если написать в смысле напечатать, то быстрее не смогу :-), а если написать код который был бы быстрее, то вот раза в два быстрее *trollface* Код:
mov eax, 1 ЗЫ полный сырок Код:
format PE console |
Ответ: Великая битва 4х языков программирования на простейшей задачке
Платон, при всем уважении, твой ексешник у меня работает 36-43 мс. а сгенирированный студией 16 (если одна итерация, как у тебя, и 12, если итераций 20 как в исходном примере) такчто студия в два раза *trollface* fasm-а.
i7 - 2600K 3.4, 16GB, Win7 64 bit |
Ответ: Великая битва 4х языков программирования на простейшей задачке
Цитата:
но, учитывая, что джава может за 43 мс, то 60 на асме - это абсолютный фейл. Да, "зоопарк" архитектур убил асм, как средство оптимизации. ЗЫ: Core i3 Sandy Bridge |
Ответ: Великая битва 4х языков программирования на простейшей задачке
такчто плюсы грубой силой дали просраться даже asm-у :)
johnk, второй вариант на D 31, 19. уже очень близко к крестам. |
Ответ: Великая битва 4х языков программирования на простейшей задачке
Вложений: 1
Код:
var allocation:546 filling:891 MidletPascal: (эмулятор KEmulator Lite) allocation: 515 filling: 234 // :4to: Железо - P4 3.2 GHz |
Ответ: Великая битва 4х языков программирования на простейшей задачке
AVL, ну ексешник же... дай.
|
Ответ: Великая битва 4х языков программирования на простейшей задачке
Цитата:
Можно еще попробывать SSE, но врятли будет профит на таком простом заполнении памяти. Цитата:
ЗЫ Как здесь удалять мессаги-то? Не вижу такой кнопки |
Ответ: Великая битва 4х языков программирования на простейшей задачке
Цитата:
|
Ответ: Великая битва 4х языков программирования на простейшей задачке
Ну чо, выбор ложиться на C# или на яву?
|
Ответ: Великая битва 4х языков программирования на простейшей задачке
бери Nemerle :-)
|
Ответ: Великая битва 4х языков программирования на простейшей задачке
C++ FTW!
|
Ответ: Великая битва 4х языков программирования на простейшей задачке
Цитата:
|
Ответ: Великая битва 4х языков программирования на простейшей задачке
Цитата:
это, кстати, ответ на вопрос Платона, почему деревья не подходят. |
Ответ: Великая битва 4х языков программирования на простейшей задачке
да не, на верхнем уровне по любому должно быть дерево. просто на ноде дерева должен висеть не один кубик, а массив 16х16х16 например.
|
Ответ: Великая битва 4х языков программирования на простейшей задачке
Вот снова затестил, такой результат:
Multidimensional allocate: 1.258ms Multidimensional fill: 701.627ms Multidimensional get 65536 times: 1.09ms Flattened allocate: 1.751ms Flattened fill: 212.648ms Flattened get 65536 times: 0.331ms Jagged allocate: 460.847ms Jagged fill: 286.233ms Jagged get 65536 times: 0.455ms Вот код с тремя вариантами: |
Ответ: Великая битва 4х языков программирования на простейшей задачке
Вложений: 1
оно берется с кэша! Мока!
Код:
using System; MD allocate 6 fill 198 get(order) 149 get(rand) 956 FLAT allocate 0.21 fill 39 get(order) 62.5 \ ??WTF get(rand) 59.58 / ??WTF JAGGED allocate 210 fill 52 get(order) 92 get(rand) 677 |
Ответ: Великая битва 4х языков программирования на простейшей задачке
Мои результаты (i5-2500K 3.3ГГц):
Multidimensional allocate: 4,948ms Multidimensional fill: 218,264ms Multidimensional get 65536 times: 0,148ms Flattened allocate: 0,239ms Flattened fill: 45,047ms Flattened get all times (ordered): 60,754ms Flattened get all times (random): 65,615ms Jagged allocate: 182,714ms Jagged fill: 66,86ms Jagged get all times (ordered): 99,008ms Jagged get all times (random): 748,584ms |
Ответ: Великая битва 4х языков программирования на простейшей задачке
вот у тебя тоже наблюдается аномалия на flatten. ordered тоже должен быть быстрее, чем random. но почему то нет. кто сможет объяснить почему?
правка: короче ето из-за оптимизирующего компилятора. вот так: Код:
elapsedFill = timer.ElapsedTicks; |
Ответ: Великая битва 4х языков программирования на простейшей задачке
причем на плюсах:
Код:
#include <iostream> естественно, сюда еще входит время обращение к массиву для получения индекса. |
Что-то я не смог избавиться от "оптимизаций компилятором", которые ухудшили результат получения данных при ordered и random индексах..
UPD: получилось. Intel Pentium 4 3.00 Ghz UPD2: Вот такие результаты: Код:
array size: 512 * 128 * 512 = 33554432 Код:
array size: 256 * 64 * 256 = 4194304 Это случаем не потому что там идёт какое-то разбиение участка памяти на куски из-за слишком больших размеров? Вот код обновил: |
Ответ: Великая битва 4х языков программирования на простейшей задачке
Результаты:
array size: 256 * 64 * 256 = 4194304 --- Multidimensional allocate: 0,743ms fill: 37,29ms get Ordered: 16,391ms get Random Order: 86,846ms --- Flattened allocate: 0,073ms fill: 12,771ms get Ordered: 13,568ms get Random Order: 12,551ms --- Jagged allocate: 10,595ms fill: 10,976ms get Ordered: 12,797ms get Random Order: 56,314ms array size: 512 * 128 * 512 = 33554432 --- Multidimensional allocate: 7,78ms fill: 258,828ms get Ordered: 133,145ms get Random Order: 791,616ms --- Flattened allocate: 0,283ms fill: 55,868ms get Ordered: 64,609ms get Random Order: 64,498ms --- Jagged allocate: 175,661ms fill: 86,344ms get Ordered: 95,213ms get Random Order: 741,485ms |
Ответ: Великая битва 4х языков программирования на простейшей задачке
Вот ещё потестил, и вывел в виде % кто превосходит или уступает multidimensional массиву, отфильтровав (сверху самые быстрые).
Код:
array size: 256 * 64 * 256 = 4194304 Код:
array size: 512 * 128 * 512 = 33554432 |
Ответ: Великая битва 4х языков программирования на простейшей задачке
вот еще один бенчмарк в копилку. язык F# (для .NET)
постарался товарищ boxxyfag Код:
open System Microsoft (R) F# 2.0 Interactive build 4.0.40219.1 Windows 7 Pro 32 Amd turion rm-74 2,20 GHz Allocation time: 00:00:00.0040002 Total loop time: 00:00:21.1218322 Average loop time: 00:00:01.0560916 |
Ответ: Великая битва 4х языков программирования на простейшей задачке
код на F# с аллокацией и одновременной инициализацией массива:
Код:
open System Allocation and init time: 00:00:13.5615343 |
Ответ: Великая битва 4х языков программирования на простейшей задачке
код на фортране, который должен по идее был всех победить, но у аффтара с рекордом не вышло ;)
автор: zxc Код:
integer before(3), after(3), I, J, K, N Celeron(R) Dual-Core CPU T3500 @ 2.10GHz Loop Time: 0.0000000 31.000000 AVG: 1.5500000 |
Часовой пояс GMT +4, время: 02:43. |
vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot