Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   скорость работы с памятью в C++ (http://forum.oszone.net/showthread.php?t=56631)

Vlad Drakula 14-11-2005 23:59 373960

скорость работы с памятью в C++
 
я решил написать несколько тестов для компьютера.
начал я с тестов памяти.

написал несколько простеньких тестов.
и скомпилировал как консольное приложение, потом скомпилировал как .NET консольное приложение.

и вот какие интересные наблюдения я сделал:

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

но после перехода на .NET все меняется, скорость работы с массивом падает в 2 раза! а скорость работы с указателем практически не меняется!

pva 16-11-2005 12:45 374471

Можно код? Какой компилятор (№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_TCHARargv[])
{
    
int xyz;
    
<< 8;

    
int t;
    
int ji100;

    
intm1 = new int[x*y*z];
    
time(NULL);
    for(
k0i--)
        for(
x*y*-1>=0;j--)
            
m1[j] = 0;

    
time(NULL) - t;
    
std::cout << "\ntest #1.1\n" << "time=" << << "\n" << "speed=" << ((sizeof(int)*((x>>2)*(y>>2)*(z>>2)*k))/(t*1<<14)) << "\n";
    
time(NULL);
    for(
k0i--)
        for(
x*y*-1>=0;j--)
        {
            
m1[j] = m1[j] = 0;
        }
    
time(NULL) - t;
    
std::cout << "\ntest #1.2\n" << "time=" << << "\n" << "speed=" << ((sizeof(int)*((x>>2)*(y>>2)*(z>>2)*k))/(t*1<<14)) << "\n";
    
time(NULL);
    for(
k0i--)
        for(
x*y*-1>=0;j--)
        {
            
m1[j] = 0;
            
m1[j] += 0;
        }
    
time(NULL) - t;
    
std::cout << "\ntest #1.3\n" << "time=" << << "\n" << "speed=" << ((sizeof(int)*((x>>2)*(y>>2)*(z>>2)*k))/(t*1<<14)) << "\n";


    
intm2,* m3,* m4;
    
m3=m1;
    
m3+=x*y*-1;
    
time(NULL);
    for(
k0i--)
        for(
m2=m1m2 <= m3;m2++)
            *
m2 0;
    
time(NULL) - t;
    
std::cout << "\ntest #2.1\n" << "time=" << << "\n" << "speed=" << ((sizeof(int)*((x>>2)*(y>>2)*(z>>2)*k))/(t*1<<14)) << "\n";


    
m3=m1;
    
m3+=x*y*-1;
    
time(NULL);
    for(
k0i--)
        for(
m2=m4=m1m2 <= m3;m2++)
            *
m2 = *m4 0;
    
time(NULL) - t;
    
std::cout << "\ntest #2.2\n" << "time=" << << "\n" << "speed=" << ((sizeof(int)*((x>>2)*(y>>2)*(z>>2)*k))/(t*1<<14)) << "\n";

    
m3=m1;
    
m3+=x*y*-1;
    
time(NULL);
    for(
k0i--)
        for(
m2=m4=m1m2 <= m3;m2++)
        {
            *
m2 0;
            *
m4 += *m2;
        }
    
time(NULL) - t;
    
std::cout << "\ntest #2.3\n" << "time=" << << "\n" << "speed=" << ((sizeof(int)*((x>>2)*(y>>2)*(z>>2)*k))/(t*1<<14)) << "\n";

    
time(NULL);
    for(
k0i--)
        for(
x*y*-1>=0;j--)
            
m1[j] = 0;
    
time(NULL) - t;
    
std::cout << "test #3\n" << "time=" << << "\n" << "speed=" << ((sizeof(int)*((x>>2)*(y>>2)*(z>>2)*k))/(t*1<<14)) << "\n";

    
m3=m1;
    
m3+=x*y*-1;
    
time(NULL);
    for(
k0i--)
        for(
m2=m1m2 <= m3;m2++)
            *
m2 0;
    
time(NULL) - t;
    
std::cout << "test #4\n" << "time=" << << "\n" << "speed=" << ((sizeof(int)*((x>>2)*(y>>2)*(z>>2)*k))/(t*1<<14)) << "\n";

    
delete m1;

    
std::cin >> j;

    return 
0;




pva 18-11-2005 09:24 375155

Код не аналогичный:
Код:

*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.

Время: 04:28.
© OSzone.net 2001-