Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование в широком смысле слова > Алгоритмика

Алгоритмика Об алгоритмах вообще; методы, обсуждения способов решения

Ответ
 
Опции темы
Старый 26.11.2011, 08:03   #16
Markova
ПроЭктировщик
 
Аватар для Markova
 
Регистрация: 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
HolyDel
 
Регистрация: 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
Вложения
Тип файла: zip test_000.zip (4.3 Кб, 375 просмотров)
(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
ffinder
Дэвелопер
 
Аватар для ffinder
 
Регистрация: 10.09.2007
Сообщений: 1,442
Написано 793 полезных сообщений
(для 1,460 пользователей)
Ответ: Великая битва 4х языков программирования на простейшей задачке

Вариант HolyDel'а выдает:
выделение памяти под массив: 0 мс
время заполнения массива: 21 мс

Плюсы как всегда дают всем просраться грубой силой
(Offline)
 
Ответить с цитированием
Старый 26.11.2011, 12:30   #20
ffinder
Дэвелопер
 
Аватар для ffinder
 
Регистрация: 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
ffinder
Дэвелопер
 
Аватар для ffinder
 
Регистрация: 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
BlackDragon
Проектировщик
 
Аватар для BlackDragon
 
Регистрация: 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;
}
Вложения
Тип файла: zip Release.zip (369.0 Кб, 362 просмотров)

Последний раз редактировалось BlackDragon, 26.11.2011 в 17:14.
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
pax (28.11.2011)
Старый 27.11.2011, 07:21   #24
johnk
Легенда
 
Регистрация: 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
Проверьте плиз кому не лень.
Вложения
Тип файла: zip test.zip (63.3 Кб, 360 просмотров)
(Offline)
 
Ответить с цитированием
Эти 5 пользователя(ей) сказали Спасибо johnk за это полезное сообщение:
HolyDel (28.11.2011), moka (27.11.2011), pax (28.11.2011), Randomize (27.11.2011), Reks888 (27.11.2011)
Старый 27.11.2011, 14:46   #25
BlackDragon
Проектировщик
 
Аватар для BlackDragon
 
Регистрация: 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)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
johnk (27.11.2011)
Старый 28.11.2011, 07:39   #26
HolyDel
 
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений
(для 2,707 пользователей)
Ответ: Великая битва 4х языков программирования на простейшей задачке

allocate 125
fill 84

выделение памяти действительно очень долгое. странно.
(Offline)
 
Ответить с цитированием
Старый 28.11.2011, 11:11   #27
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 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 
DateTime.Now.Ticks;

            var 
map = new int[512 128 512];

            var 
allocate_time DateTime.Now.Ticks a;

            
DateTime.Now.Ticks;
            for (
int i 020; ++i)
            {
                for (
int x 0512; ++x)
                {
                    for (
int y 0128; ++y)
                    {
                        for (
int z 0512; ++z)
                        {
                            ++
counter;
                            
map[512 128 128 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
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
HolyDel (28.11.2011)
Старый 28.11.2011, 11:29   #28
HolyDel
 
Регистрация: 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)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
pax (28.11.2011)
Старый 28.11.2011, 14:10   #29
AVL
Разработчик
 
Регистрация: 27.01.2011
Адрес: Афипский
Сообщений: 419
Написано 100 полезных сообщений
(для 182 пользователей)
Ответ: Великая битва 4х языков программирования на простейшей задачке

А если на ассемблере попробовать? Я понимаю, что про 1й пункт можно забыть, но все же.
(Offline)
 
Ответить с цитированием
Старый 28.11.2011, 14:17   #30
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений
(для 5,323 пользователей)
Ответ: Великая битва 4х языков программирования на простейшей задачке

Сообщение от AVL Посмотреть сообщение
А если на ассемблере попробовать? Я понимаю, что про 1й пункт можно забыть, но все же.
Так попробуй!
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Часовой пояс GMT +4, время: 18:34.


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com