1

Тема: Як підрахувати час роботи функції?

Хай. В мене таке завдання --- написати функцію на С++, і таку саму на inline assembler, а потім порівняти, яка швидше працює.
Stopwatch'а я не бачу. В гуглах надибав приклад з бібліотекою chrono, але там немає тіків, а тілько наносекунди, і завжди виводить нуль.
Чому так?

#include <cstdio>
#include <iostream>
#include <chrono>

using namespace std;
namespace cr = std::chrono;

int  firstTask(int a, int b, int c)
{
    __asm {
        mov eax,a
        mul b
        sub eax,c
    }

}

int secondTask(int *arr, int lengths)
{
    __asm {

        mov ebx, [arr]
        mov esi,0
        mov eax, DWord Ptr[ebx + type arr * 0]

    cycleCmp:
        cmp esi,lengths
        jb body
        jmp end1

    body:
        inc esi
        cmp eax, DWord Ptr[ebx + type arr * esi]
        jnc ifLess
        jmp cycleCmp

    ifLess:
        mov eax, DWord Ptr[ebx + type arr * esi]
        jmp cycleCmp

    end1: 
        sub eax, DWord Ptr[ebx + type arr * esi]
    }
}

int secondTaskCpp(int* arr, int length)
{
    int min = arr[0];
    for (int i = 1; i < length; i++)
    {
        if (arr[i] < min)
        {
            min = arr[i];
        }
    }
    return min - arr[length - 1];
}


int main()
{
    cr::high_resolution_clock my_clock;

    int i;
    i = firstTask(2, 3, 4);
    
    cout << i << endl;

    int arr[] = { 5, 4, 7, 8, 1, 5, 4, 2, 5 };

    int length = sizeof(arr) / sizeof(arr[0]);
    int j, k;
    auto asmTime = my_clock.now();

    j = secondTask(arr, length-1);

    auto asmTime1 = my_clock.now();
    auto asmDiff = asmTime1 - asmTime;

    auto cppTime = my_clock.now();

    k = secondTaskCpp(arr, length);

    auto cppTime1 = my_clock.now();
    auto cppDiff = cppTime1 - cppTime;

    cout << "j: " << j << "\t" << cr::duration_cast<cr::nanoseconds>(asmDiff).count()
        << "\nk: " << k << "\t" << cr::duration_cast<cr::nanoseconds>(cppDiff).count() << endl;

    system("pause>>void");
}

http://не-дійсний-домен/bNivj/ec2b58d87b.png

2

Re: Як підрахувати час роботи функції?

А ви певні, що воно в наносекунду не вкладеться? 9 int-ів - це повністю в регістри x64 влазить, суперскалярний процесор може кілька операцій за раз виконувати... Ну і роздільна здатність high_resolution_clock стандартом не задана, може, воно і в мілісекундах насправді (це треба в документації компілятора дивится), а їх там 0.

3

Re: Як підрахувати час роботи функції?

koala написав:

А ви певні, що воно в наносекунду не вкладеться? 9 int-ів - це повністю в регістри x64 влазить, суперскалярний процесор може кілька операцій за раз виконувати... Ну і роздільна здатність high_resolution_clock стандартом не задана, може, воно і в мілісекундах насправді (це треба в документації компілятора дивится), а їх там 0.

Ну я не певний... Так може порадите якийсь кращий спосіб, щоб можна було у тих тактах рахувати?

4

Re: Як підрахувати час роботи функції?

Крутіть 1000000 циклів.

5

Re: Як підрахувати час роботи функції?

koala написав:

Крутіть 1000000 циклів.

ого, асемблер в 3 рази швидше
http://не-дійсний-домен/bNnyn/970e8fc336.png

6

Re: Як підрахувати час роботи функції?

Оптимізація компілятора увімкнена?

7

Re: Як підрахувати час роботи функції?

koala написав:

Оптимізація компілятора увімкнена?

Хз, де то подивитись?

8 Востаннє редагувалося 0xDADA11C7 (25.09.2014 18:59:52)

Re: Як підрахувати час роботи функції?

Замініть це, бо такого вже навіть від компілерів не побачиш :)

jb body
jmp end1
 
body:

на це:

jnb end1
 
body:

і з другим кодом також зробіть. Як увімкнете оптимізацію - робіть її по швидкості

Хз, де то подивитись?

у властивостях проекта, хоча я її роблю в командному рядку

Подякували: koala1

9

Re: Як підрахувати час роботи функції?

FakiNyan написав:
koala написав:

Оптимізація компілятора увімкнена?

Хз, де то подивитись?

В налаштуваннях.

10 Востаннє редагувалося FakiNyan (25.09.2014 19:02:29)

Re: Як підрахувати час роботи функції?

0xDADA11C7 написав:

Замініть це, бо такого вже навіть від компілерів не побачиш :)

jb body
jmp end1
 
body:

на це:

jnb end1
 
body:

і з другим кодом також зробіть. Як увімкнете оптимізацію - робіть її по швидкості

Хз, де то подивитись?

у властивостях проекта, хоча я її роблю в командному рядку

А яка різниця між тими jnb і jb?

11

Re: Як підрахувати час роботи функції?

Ось це є оптимізація?
http://не-дійсний-домен/bNsVV/1418b9cabf.png

12

Re: Як підрахувати час роботи функції?

А яка різниця між тими jnb і jb?

така сама як між jz і jnz - тобто одне спрацьовує коли прапорця встановлено, а друге - коли спущено

Подякували: FakiNyan, koala2

13 Востаннє редагувалося koala (25.09.2014 19:47:05)

Re: Як підрахувати час роботи функції?

Радше так:

перша стрілочка

http://helloacm.com/images/programming/2013/tail-recursion/release.jpg

і порівнювати в релізі, дебажний білд додає ще команди.

Ну і ще одне місце (де ifLess) ви пропустили. Взагалі, комбінація

jx label1
jmp label2
label1:

може бути замінена на

jnx label2

(якщо в першому фрагменті jnx, то міняти, відповідно, на jx, де x - довільний флаг умовного переходу).

Подякували: FakiNyan1

14

Re: Як підрахувати час роботи функції?

Тепер не в 3, а в 2.
http://не-дійсний-домен/bNwqB/0889afafcb.png

Подякували: koala1

15

Re: Як підрахувати час роботи функції?

ось так можна змінити оптимізацію

http://s28.postimg.org/ac7769ue1/opt.jpg