forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Алгоритмика (http://forum.boolean.name/forumdisplay.php?f=21)
-   -   Великая битва 4х языков программирования на простейшей задачке (http://forum.boolean.name/showthread.php?t=15917)

Markova 26.11.2011 08:03

Ответ: Великая битва 4х языков программирования на простейшей задачке
 
Цитата:

Сообщение от ffinder (Сообщение 211269)

И результаты:
время выделения массива: 0 мс
время заполения: 187 мс

Вот так, старичок Блиц нервно курит в стороне. Всё таки новые технологии явно лучше. Прямо проникаешься производительностью дотнета.

Вот… а теперь он не подолёку встал, ругается матом и пьет пива)
alloc 0 ms fill 247 ms

Платон Александрович спас положение!:super:

Платон Александрович 26.11.2011 08:38

Ответ: Великая битва 4х языков программирования на простейшей задачке
 
Цитата:

Сообщение от Markova (Сообщение 211291)
Вот… а теперь он не подолёку встал, ругается матом и пьет пива)
alloc 0 ms fill 247 ms

Платон Александрович спас положение!:super:

про alloc 0 я пояснил почему - память не выделяется в случае такого массива (с квадратными скобками), он статичный, для него используется память из стека. Так что не считается, а то тут некоторые товарищи уже шум поднимают по поводу честности теста :-)

HolyDel 26.11.2011 09:21

Ответ: Великая битва 4х языков программирования на простейшей задачке
 
Вложений: 1
эффективность работы программиста (когда дело касается не формошлепства) на С++ вещь спорная. такчто я вчеркнул его назад.
Код:

#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

ffinder 26.11.2011 11:55

Ответ: Великая битва 4х языков программирования на простейшей задачке
 
Вариант HolyDel'а выдает:
выделение памяти под массив: 0 мс
время заполнения массива: 21 мс

Плюсы как всегда дают всем просраться грубой силой;)

ffinder 26.11.2011 12:30

Ответ: Великая битва 4х языков программирования на простейшей задачке
 
Цитата:

Сообщение от MoKa (Сообщение 211283)
В .Net, используй в циклах ++x а не x++.

результат не изменился.

Цитата:

Сообщение от MoKa (Сообщение 211283)
И используй Jagged Array, он будет где-то в 2-3 раза быстрее.

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

ffinder 26.11.2011 12:45

Ответ: Великая битва 4х языков программирования на простейшей задачке
 
Цитата:

Сообщение от Платон Александрович (Сообщение 211285)
Не 20, а 21, хотя потом время делишь на 20.

тут согласен полностью.
перемерял, получилось:
выделение: 50 мс
заполнение: 678 мс

Цитата:

Сообщение от Платон Александрович (Сообщение 211285)
В данном конкретном случае можно немного оптимизировать :)

в данном случае, батенька Платон Александрович, нельзя оптимизировать даже немного. А вы тут bit-swizzling'ом индексы высчитываете. Если так, то и в остальных тестах индекс нужно расчитывать именно по такой формуле, а это нарушает условие "битвы", что писать код должно быть удобно и чисто.

Цитата:

Сообщение от Платон Александрович (Сообщение 211285)
В результате у меня аллокация ~0мс (ну это понятно, память со стека берется), заполнение ~210мс

вот тут не согласен категорически. массив занимает 128 мегабайт, на стеке такое просто не поместится. хотелось бы узнать, что Марк нахимичил с кодогенерацией и чем директива Local так ускоряет выделение памяти.
Цитата:

Сообщение от Платон Александрович (Сообщение 211285)
Да и еще, помоему для minecraft-like игр юзать 3д массивы - чистое нубство :)

я думаю толстую зеленую рожу от монитора можно и отодвинуть:-D
а если серьезно - то вы зацикливаетесь на хранении и сжатии данных, из расчета, что они будут статичными. если же представить себе мир с гидро и аэродинамикой, хотя бы примитивной, то всякие разреженные деревья не подходят.

Платон Александрович 26.11.2011 14:32

Ответ: Великая битва 4х языков программирования на простейшей задачке
 
Цитата:

Сообщение от ffinder (Сообщение 211306)
А вы тут bit-swizzling'ом индексы высчитываете.

это не свизлинг, а обычный предрасчет, битовые сдвиги в начале я написал чтоб наглядно было по поводу степени двойки.
Цитата:

Сообщение от ffinder (Сообщение 211306)
Если так, то и в остальных тестах индекс нужно расчитывать именно по такой формуле

По крайней мере для плюсов ненадо, компилятор оптимизирующий, он сам поймет что размеры константные, да еще степени двойки, и все сделает хорошо :) В отличие от блица :)

Цитата:

Сообщение от ffinder (Сообщение 211306)
вот тут не согласен категорически. массив занимает 128 мегабайт, на стеке такое просто не поместится. хотелось бы узнать, что Марк нахимичил с кодогенерацией и чем директива Local так ускоряет выделение памяти.

Да это я ступил, на самом деле статические массивы выделяются на старте блица, а Local говорит компилятору выделить смещение в стеке под указатель на этот массив, т.е. это для компайл-тайма.

Цитата:

Сообщение от ffinder (Сообщение 211306)
а если серьезно - то вы зацикливаетесь на хранении и сжатии данных, из расчета, что они будут статичными.

О статичном речи и не шло вообще, minecraft же. Жду пояснений по поводу
Цитата:

Сообщение от ffinder (Сообщение 211306)
Всякие разреженные деревья не подходят.


BlackDragon 26.11.2011 16:05

Ответ: Великая битва 4х языков программирования на простейшей задачке
 
Вложений: 1
Вот мой вариант:
Чем больше ядер, тем быстрее.

Код:

#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;
}


johnk 27.11.2011 07:21

Ответ: Великая битва 4х языков программирования на простейшей задачке
 
Вложений: 1
Чисто ради интереса перевел вариант 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
Проверьте плиз кому не лень.

BlackDragon 27.11.2011 14:46

Ответ: Великая битва 4х языков программирования на простейшей задачке
 
Цитата:

Сообщение от johnk (Сообщение 211392)
Проверьте плиз кому не лень.

Allocation took: 78 ms
Total filling time: 938 ms
Average fill time per step: 46 ms

HolyDel 28.11.2011 07:39

Ответ: Великая битва 4х языков программирования на простейшей задачке
 
allocate 125
fill 84

выделение памяти действительно очень долгое. странно.

pax 28.11.2011 11:11

Ответ: Великая битва 4х языков программирования на простейшей задачке
 
Вариант HolyDel'a на шарпе:
PHP код:

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

HolyDel 28.11.2011 11:29

Ответ: Великая битва 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 на заливку.

AVL 28.11.2011 14:10

Ответ: Великая битва 4х языков программирования на простейшей задачке
 
А если на ассемблере попробовать? Я понимаю, что про 1й пункт можно забыть, но все же.

pax 28.11.2011 14:17

Ответ: Великая битва 4х языков программирования на простейшей задачке
 
Цитата:

Сообщение от AVL (Сообщение 211493)
А если на ассемблере попробовать? Я понимаю, что про 1й пункт можно забыть, но все же.

Так попробуй!


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

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot