|
Алгоритмика Об алгоритмах вообще; методы, обсуждения способов решения |
26.11.2011, 08:03
|
#16
|
ПроЭктировщик
Регистрация: 11.10.2011
Адрес: Мурманск
Сообщений: 154
Написано 74 полезных сообщений (для 218 пользователей)
|
Ответ: Великая битва 4х языков программирования на простейшей задачке
Сообщение от ffinder
И результаты:
время выделения массива: 0 мс
время заполения: 187 мс
Вот так, старичок Блиц нервно курит в стороне. Всё таки новые технологии явно лучше. Прямо проникаешься производительностью дотнета.
|
Вот… а теперь он не подолёку встал, ругается матом и пьет пива)
alloc 0 ms fill 247 ms
Платон Александрович спас положение!
__________________
Острый психоз- это когда вы разговариваете с кошкой.
Острый галлюцинаторный психоз - вы говорите с кошкой, которой не существует.
Паранойя - вы боитесь ляпнуть лишнего при кошке.
Шизофрения - иногда у вас появляется кошка, которая разговаривает.
Неврастения - вы жалуетесь кошке, она молчит, игнорирует вас и это для вас невыносимо!!!
Навязчивый невроз - вы уверены, что кошка не одна и они что-то замышляют!
|
(Offline)
|
|
26.11.2011, 08:38
|
#17
|
Нуждающийся
Регистрация: 05.10.2011
Адрес: Россия, Южно-Сахалинск
Сообщений: 66
Написано 42 полезных сообщений (для 83 пользователей)
|
Ответ: Великая битва 4х языков программирования на простейшей задачке
Сообщение от Markova
Вот… а теперь он не подолёку встал, ругается матом и пьет пива)
alloc 0 ms fill 247 ms
Платон Александрович спас положение!
|
про alloc 0 я пояснил почему - память не выделяется в случае такого массива (с квадратными скобками), он статичный, для него используется память из стека. Так что не считается, а то тут некоторые товарищи уже шум поднимают по поводу честности теста
|
(Offline)
|
|
26.11.2011, 09:21
|
#18
|
☭
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений (для 2,707 пользователей)
|
Ответ: Великая битва 4х языков программирования на простейшей задачке
эффективность работы программиста (когда дело касается не формошлепства) на С++ вещь спорная. такчто я вчеркнул его назад.
#include <iostream>
#include <Windows.h>
int main()
{
int counter = 0;
auto a = GetTickCount();
int* map = new int[512*128*512];
int allocate_time = GetTickCount() - a;
a = GetTickCount();
for(int i=0;i<20;++i)
{
for(int x =0;x<512;++x)
{
for(int y = 0;y<128;++y)
{
for(int z =0;z<512;++z)
{
++counter;
map[512 * 128 * x + 128 * y + z] = counter;
}
}
}
}
int fill_time = GetTickCount() - a;
std::cout<<"allocate time:"<<allocate_time<<std::endl;
std::cout<<"fill time:"<<(fill_time/20)<<std::endl;
std::cin.get();
return 0;
}
allocate - 0
fill - 17
|
(Offline)
|
|
Эти 13 пользователя(ей) сказали Спасибо HolyDel за это полезное сообщение:
|
ABTOMAT (27.11.2011), cahekp (28.11.2011), ffinder (26.11.2011), Hurrit (26.11.2011), Igor (27.11.2011), is.SarCasm (26.11.2011), Mhyhr (26.11.2011), moka (26.11.2011), pax (28.11.2011), radiobutton (24.10.2012), Randomize (26.11.2011), Reks888 (27.11.2011), scimitar (09.02.2015)
|
26.11.2011, 11:55
|
#19
|
Дэвелопер
Регистрация: 10.09.2007
Сообщений: 1,442
Написано 793 полезных сообщений (для 1,460 пользователей)
|
Ответ: Великая битва 4х языков программирования на простейшей задачке
Вариант HolyDel'а выдает:
выделение памяти под массив: 0 мс
время заполнения массива: 21 мс
Плюсы как всегда дают всем просраться грубой силой
|
(Offline)
|
|
26.11.2011, 12:30
|
#20
|
Дэвелопер
Регистрация: 10.09.2007
Сообщений: 1,442
Написано 793 полезных сообщений (для 1,460 пользователей)
|
Ответ: Великая битва 4х языков программирования на простейшей задачке
Сообщение от MoKa
В .Net, используй в циклах ++x а не x++.
|
результат не изменился.
Сообщение от MoKa
И используй Jagged Array, он будет где-то в 2-3 раза быстрее.
|
мне нужен сплошной кусок памяти, а не куча разбросанных непонятно где непонятно как массивов.
да и меряем технологии на одинаковой задаче, по возможности.
|
(Offline)
|
|
26.11.2011, 12:45
|
#21
|
Дэвелопер
Регистрация: 10.09.2007
Сообщений: 1,442
Написано 793 полезных сообщений (для 1,460 пользователей)
|
Ответ: Великая битва 4х языков программирования на простейшей задачке
Сообщение от Платон Александрович
Не 20, а 21, хотя потом время делишь на 20.
|
тут согласен полностью.
перемерял, получилось:
выделение: 50 мс
заполнение: 678 мс
Сообщение от Платон Александрович
В данном конкретном случае можно немного оптимизировать
|
в данном случае, батенька Платон Александрович, нельзя оптимизировать даже немного. А вы тут bit-swizzling'ом индексы высчитываете. Если так, то и в остальных тестах индекс нужно расчитывать именно по такой формуле, а это нарушает условие "битвы", что писать код должно быть удобно и чисто.
Сообщение от Платон Александрович
В результате у меня аллокация ~0мс (ну это понятно, память со стека берется), заполнение ~210мс
|
вот тут не согласен категорически. массив занимает 128 мегабайт, на стеке такое просто не поместится. хотелось бы узнать, что Марк нахимичил с кодогенерацией и чем директива Local так ускоряет выделение памяти.
Сообщение от Платон Александрович
Да и еще, помоему для minecraft-like игр юзать 3д массивы - чистое нубство
|
я думаю толстую зеленую рожу от монитора можно и отодвинуть
а если серьезно - то вы зацикливаетесь на хранении и сжатии данных, из расчета, что они будут статичными. если же представить себе мир с гидро и аэродинамикой, хотя бы примитивной, то всякие разреженные деревья не подходят.
|
(Offline)
|
|
26.11.2011, 14:32
|
#22
|
Нуждающийся
Регистрация: 05.10.2011
Адрес: Россия, Южно-Сахалинск
Сообщений: 66
Написано 42 полезных сообщений (для 83 пользователей)
|
Ответ: Великая битва 4х языков программирования на простейшей задачке
Сообщение от ffinder
А вы тут bit-swizzling'ом индексы высчитываете.
|
это не свизлинг, а обычный предрасчет, битовые сдвиги в начале я написал чтоб наглядно было по поводу степени двойки.
Сообщение от ffinder
Если так, то и в остальных тестах индекс нужно расчитывать именно по такой формуле
|
По крайней мере для плюсов ненадо, компилятор оптимизирующий, он сам поймет что размеры константные, да еще степени двойки, и все сделает хорошо В отличие от блица
Сообщение от ffinder
вот тут не согласен категорически. массив занимает 128 мегабайт, на стеке такое просто не поместится. хотелось бы узнать, что Марк нахимичил с кодогенерацией и чем директива Local так ускоряет выделение памяти.
|
Да это я ступил, на самом деле статические массивы выделяются на старте блица, а Local говорит компилятору выделить смещение в стеке под указатель на этот массив, т.е. это для компайл-тайма.
Сообщение от ffinder
а если серьезно - то вы зацикливаетесь на хранении и сжатии данных, из расчета, что они будут статичными.
|
О статичном речи и не шло вообще, minecraft же. Жду пояснений по поводу
Сообщение от ffinder
Всякие разреженные деревья не подходят.
|
|
(Offline)
|
|
26.11.2011, 16:05
|
#23
|
Проектировщик
Регистрация: 25.03.2007
Сообщений: 536
Написано 252 полезных сообщений (для 715 пользователей)
|
Ответ: Великая битва 4х языков программирования на простейшей задачке
Вот мой вариант:
Чем больше ядер, тем быстрее.
#include <iostream>
#include <time.h>
#include <omp.h>
using namespace std;
int main()
{
cout << "Start!" << endl;
int x_sz=512;
int y_sz=128;
int z_sz=512;
//=================================================
int timer0=clock();
int * array=new int[x_sz*y_sz*z_sz];
float timer3=(clock()-timer0);
//==Содержание 1D массива аналогично 3D, но так проще=====
int timer4=clock();
for (int a = 0; a < 100; a++)
{
#pragma omp parallel for
for(int n = 0; n < x_sz*y_sz*z_sz; n++)
{
array[n]=n;
}
}
float timer5=(clock()-timer4);
//==================================================
cout << "Create arr: " <<timer3<<" ms"<<endl;
cout << "1D arr: " <<timer5*0.01<<" ms"<<endl;
return 0;
}
Последний раз редактировалось BlackDragon, 26.11.2011 в 17:14.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
27.11.2011, 07:21
|
#24
|
Легенда
Регистрация: 01.10.2006
Сообщений: 3,705
Написано 296 полезных сообщений (для 568 пользователей)
|
Ответ: Великая битва 4х языков программирования на простейшей задачке
Чисто ради интереса перевел вариант HolyDel'a на Ди:
import std.c.windows.windows : GetTickCount;
import std.stdio : writef, readln;
void main()
{
int counter = 0;
auto current = GetTickCount();
int[] map = new int[512 * 128 * 512];
int allocationTime = GetTickCount() - current;
current = GetTickCount();
for(int i = 0; i < 20; ++i)
{
for(int x = 0; x < 512; ++x)
{
for(int y = 0; y < 128; ++y)
{
for(int z = 0; z < 512;++z)
{
++counter;
map[512 * 128 * x + 128 * y + z] = counter;
}
}
}
}
int fillingTime = GetTickCount() - current;
writef("Allocation took: ", allocationTime, "ms\n");
writef("Total filling time: ", fillingTime, "ms\n");
writef("Average fill time per step: ", fillingTime/20, "ms\n");
readln();
}
dmd 1.071, ключи компиляции: -inline -O -release.
У меня результаты странные:
Allocation took: 141ms
Total filling time: 1734ms
Average fill time per step: 86ms
|
Проверьте плиз кому не лень.
|
(Offline)
|
|
Эти 5 пользователя(ей) сказали Спасибо johnk за это полезное сообщение:
|
|
27.11.2011, 14:46
|
#25
|
Проектировщик
Регистрация: 25.03.2007
Сообщений: 536
Написано 252 полезных сообщений (для 715 пользователей)
|
Ответ: Великая битва 4х языков программирования на простейшей задачке
Сообщение от johnk
Проверьте плиз кому не лень.
|
Allocation took: 78 ms
Total filling time: 938 ms
Average fill time per step: 46 ms
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
28.11.2011, 07:39
|
#26
|
☭
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений (для 2,707 пользователей)
|
Ответ: Великая битва 4х языков программирования на простейшей задачке
allocate 125
fill 84
выделение памяти действительно очень долгое. странно.
|
(Offline)
|
|
28.11.2011, 11:11
|
#27
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Ответ: Великая битва 4х языков программирования на простейшей задачке
Вариант HolyDel'a на шарпе:
using System;
namespace speedTest { static class Program { static int Main() { int counter = 0;
var a = DateTime.Now.Ticks;
var map = new int[512 * 128 * 512];
var allocate_time = DateTime.Now.Ticks - a;
a = DateTime.Now.Ticks; for (int i = 0; i < 20; ++i) { for (int x = 0; x < 512; ++x) { for (int y = 0; y < 128; ++y) { for (int z = 0; z < 512; ++z) { ++counter; map[512 * 128 * x + 128 * y + z] = counter; } } } }
var fill_time = DateTime.Now.Ticks - a; Console.WriteLine("allocate time: {0}", allocate_time / 10000f); Console.WriteLine("fill time: {0}", (fill_time / 20f) / 10000f); Console.Read(); return 0; } } }
Результаты на рабочей машине (не той которая в подписи, а чуть по мощнее, но тоже i5)
allocate time: 1,0001
fill time: 43,00246
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
28.11.2011, 11:29
|
#28
|
☭
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений (для 2,707 пользователей)
|
Ответ: Великая битва 4х языков программирования на простейшей задачке
И используй Jagged Array, он будет где-то в 2-3 раза быстрее.
|
теоретически должно быть сильно медленнее. особенно аллокация. и доступ тоже - из-за paging-а памяти.
упд. теория подтвердилась практикой:
using System;
namespace speedTest
{
static class Program
{
static int Main()
{
int counter = 0;
var a = DateTime.Now.Ticks;
int[][][] map = new int[512][][];
for (int y = 0; y < 512; ++y)
{
map[y]= new int[128][];
for (int z = 0; z < 128; ++z)
{
map[y][z] = new int[512];
}
}
var allocate_time = DateTime.Now.Ticks - a;
a = DateTime.Now.Ticks;
for (int i = 0; i < 20; ++i)
{
for (int x = 0; x < 512; ++x)
{
for (int y = 0; y < 128; ++y)
{
for (int z = 0; z < 512; ++z)
{
++counter;
map[x][y][z] = counter;
}
}
}
}
var fill_time = DateTime.Now.Ticks - a;
Console.WriteLine("allocate time: {0}", allocate_time / 10000f);
Console.WriteLine("fill time: {0}", (fill_time / 20f) / 10000f);
Console.Read();
return 0;
}
}
}
529 на аллокацию и 254 на заливку.
у меня вариант pax-а дает 2 на аллокацию и 176 на заливку.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
28.11.2011, 14:10
|
#29
|
Разработчик
Регистрация: 27.01.2011
Адрес: Афипский
Сообщений: 419
Написано 100 полезных сообщений (для 182 пользователей)
|
Ответ: Великая битва 4х языков программирования на простейшей задачке
А если на ассемблере попробовать? Я понимаю, что про 1й пункт можно забыть, но все же.
|
(Offline)
|
|
28.11.2011, 14:17
|
#30
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Ответ: Великая битва 4х языков программирования на простейшей задачке
Сообщение от AVL
А если на ассемблере попробовать? Я понимаю, что про 1й пункт можно забыть, но все же.
|
Так попробуй!
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 00:38.
|