Этот код:
#include <memory>
#include <time.h>
#include <chrono>
#include <thread>
#include <stdio.h>
#include <stdlib.h>
void Test( ) {
#define current_milliseconds std::chrono::duration_cast<std::chrono::milliseconds>( std::chrono::system_clock::now( ).time_since_epoch( ) ).count( )
int *c = ( int* )malloc( 1024 * 1024 * 1024 );
int result = 0;
auto millis = -current_milliseconds;
//clock_t timer = -clock( );
for ( int i = 0 ; i < 1024 * 1024 * 256 /* 1024 / 4 */; ++i )
result += c[ i ];
millis += current_milliseconds;
printf( "Took: %ldms (JUST PASSING BY: %d)\n", millis, result );
free( c );
#undef current_milliseconds
}
int main( ) {
std::this_thread::sleep_for( std::chrono::milliseconds( 1 ) );
Test( );
std::this_thread::sleep_for( std::chrono::milliseconds( 1 ) );
Test( );
return -1;
}
Я провел 7 тестов и дал последние 6 выходов:
Took: 502ms (JUST PASSING BY: 0)
Took: 607ms (JUST PASSING BY: 0)
Took: 480ms (JUST PASSING BY: 0)
Took: 588ms (JUST PASSING BY: 0)
Took: 492ms (JUST PASSING BY: 0)
Took: 562ms (JUST PASSING BY: 0)
Took: 506ms (JUST PASSING BY: 0)
Took: 558ms (JUST PASSING BY: 0)
Took: 470ms (JUST PASSING BY: 0)
Took: 555ms (JUST PASSING BY: 0)
Took: 510ms (JUST PASSING BY: 0)
Took: 562ms (JUST PASSING BY: 0)
Если ваш результат отличается, попробуйте снова запустить исполняемый файл (промахи кэша на жестком диске) или попробуйте увеличить количество итераций и выделенных байтов (У вас есть чувство).
Обратите внимание, что диапазон кода таймера находится только в цикле, а не в распределении; то снова возникает вопрос: почему вторая итерация медленнее? Есть ли способ исправить это?
Дополнительная информация:
- У этого ПК есть процессор Pentium 2.8GHZ @2 ядра (Intel E6300), 4 ГБ оперативной памяти (с оперативной памятью 2,2 ГБ до выполнения тестов) и корпоративный Intel SSD.
- Кажется, что при выполнении тестов он написал несколько из 100 МБ. Почему это произошло, когда у него было достаточно свободной памяти? (Я освободил 1 ГБ, а затем выделил еще 1 ГБ, он не должен пропускать pre-swapfile).