Vlad Drakula |
14-11-2005 23:59 373960 |
скорость работы с памятью в C++
я решил написать несколько тестов для компьютера.
начал я с тестов памяти.
написал несколько простеньких тестов.
и скомпилировал как консольное приложение, потом скомпилировал как .NET консольное приложение.
и вот какие интересные наблюдения я сделал:
скорость работы с одномерным массивом и с указателем на последовательной запист практически одинаковая, но вижуалка умеет оптимизировать работу с массивом при повторном обращении, а с указателем так не получается.
но после перехода на .NET все меняется, скорость работы с массивом падает в 2 раза! а скорость работы с указателем практически не меняется!
|
Можно код? Какой компилятор (№1)? Какие настройки компилятора? У меня при компиляции с sse2 скорость счёта возрастает в 2-4 раза.
Какое железо? На машине класса P6 (архитектуры IA-32) полезно укладывать доступ к памяти по 16 байт.
Причём (intel P-IV 1600, Windows XP, Metrowerks CodeWarrior 8.0, generic x86, release)
Код:
for(int i=0; i<100; ++i)
{
data[i] += 10;
}
Работает быстрее (что вообще-то странно), чем
Код:
for(data_type *a=data, *b=data+100; a!=b; ++a)
{
*a += 10;
}
Какой тип данных используется? Если можно, как это откомпилялось на ассемблере.
|
Vlad Drakula |
16-11-2005 13:27 374486 |
PHP код:
// test.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
int x, y, z;
z = y = x = 1 << 8;
int t;
int j, i, k = 100;
int* m1 = new int[x*y*z];
t = time(NULL);
for(i = k; i > 0; i--)
for(j = x*y*z -1; j >=0;j--)
m1[j] = 0;
t = time(NULL) - t;
std::cout << "\ntest #1.1\n" << "time=" << t << "\n" << "speed=" << ((sizeof(int)*((x>>2)*(y>>2)*(z>>2)*k))/(t*1<<14)) << "\n";
t = time(NULL);
for(i = k; i > 0; i--)
for(j = x*y*z -1; j >=0;j--)
{
m1[j] = m1[j] = 0;
}
t = time(NULL) - t;
std::cout << "\ntest #1.2\n" << "time=" << t << "\n" << "speed=" << ((sizeof(int)*((x>>2)*(y>>2)*(z>>2)*k))/(t*1<<14)) << "\n";
t = time(NULL);
for(i = k; i > 0; i--)
for(j = x*y*z -1; j >=0;j--)
{
m1[j] = 0;
m1[j] += 0;
}
t = time(NULL) - t;
std::cout << "\ntest #1.3\n" << "time=" << t << "\n" << "speed=" << ((sizeof(int)*((x>>2)*(y>>2)*(z>>2)*k))/(t*1<<14)) << "\n";
int* m2,* m3,* m4;
m3=m1;
m3+=x*y*z -1;
t = time(NULL);
for(i = k; i > 0; i--)
for(m2=m1; m2 <= m3;m2++)
*m2 = 0;
t = time(NULL) - t;
std::cout << "\ntest #2.1\n" << "time=" << t << "\n" << "speed=" << ((sizeof(int)*((x>>2)*(y>>2)*(z>>2)*k))/(t*1<<14)) << "\n";
m3=m1;
m3+=x*y*z -1;
t = time(NULL);
for(i = k; i > 0; i--)
for(m2=m4=m1; m2 <= m3;m2++)
*m2 = *m4 = 0;
t = time(NULL) - t;
std::cout << "\ntest #2.2\n" << "time=" << t << "\n" << "speed=" << ((sizeof(int)*((x>>2)*(y>>2)*(z>>2)*k))/(t*1<<14)) << "\n";
m3=m1;
m3+=x*y*z -1;
t = time(NULL);
for(i = k; i > 0; i--)
for(m2=m4=m1; m2 <= m3;m2++)
{
*m2 = 0;
*m4 += *m2;
}
t = time(NULL) - t;
std::cout << "\ntest #2.3\n" << "time=" << t << "\n" << "speed=" << ((sizeof(int)*((x>>2)*(y>>2)*(z>>2)*k))/(t*1<<14)) << "\n";
t = time(NULL);
for(i = k; i > 0; i--)
for(j = x*y*z -1; j >=0;j--)
m1[j] = 0;
t = time(NULL) - t;
std::cout << "test #3\n" << "time=" << t << "\n" << "speed=" << ((sizeof(int)*((x>>2)*(y>>2)*(z>>2)*k))/(t*1<<14)) << "\n";
m3=m1;
m3+=x*y*z -1;
t = time(NULL);
for(i = k; i > 0; i--)
for(m2=m1; m2 <= m3;m2++)
*m2 = 0;
t = time(NULL) - t;
std::cout << "test #4\n" << "time=" << t << "\n" << "speed=" << ((sizeof(int)*((x>>2)*(y>>2)*(z>>2)*k))/(t*1<<14)) << "\n";
delete m1;
std::cin >> j;
return 0;
}
|
Код не аналогичный:
Код:
*m2 = 0;
*m4 += *m2;
работает медленнее, чем
m[i] = 0;
m[i] += 0;
т.к. во втором случае - обе константы
циклы
for(int i=100; --i>=0; ) {...}
лучше оптимизируются, чем
for(int i=0; i<=100; ++i) {...}
Все эти ньюансы есть у Intel SDK на www.intel.com
Цитата:
оптимизировать работу с массивом при повторном обращении
|
А если одно и то же действие выполнить?
Код:
void fillArray(int* mem)
{
for(int i=0; i<1<<(8*3); ++i)
{
mem[i] = 0x12345678;
}
}
for(int i=0; i<10; ++i)
{
time1 = GetTickCount();
fillArray(mem);
std::cout << (GetTickCount() - time1) << "\n";
}
|
Время: 04:28.
© OSzone.net 2001-