最近のPCなら普通コア2なCPUが載っています。
スレッド分ければ分散されて高速になるんだね。
シングルコアCPUだと逆に遅くなるはず。
ネタ元
VC++2008では上記URLにあるサンプルまんまではコンパイルエラーだったので以下のようにした。
#include "stdafx.h"
#include <algorithm>
#include <utility>
#include <cstdlib>
#include <process.h>
#include <windows.h>
#include <iostream>
unsigned __stdcall process(void* pvParam) {
std::pair<int*,int*>* range = (std::pair<int*,int*>*)pvParam;
std::sort(range->first, range->second);
return 0;
}
int _tmain(int argc, _TCHAR* argv[])
{
const int N = 200000;
const int N2 = N*2;
int *data = new int[N2];
// 地味に単スレッド
{
srand(1);
for ( int i = 0; i < N2; ++i ) data[i] = std::rand();
// data[0..N2] をソート
std::cout << "single thread ..." << std::flush;
long t = GetTickCount();
std::sort(data, data+N2);
std::cout << GetTickCount() - t << std::endl;
}
// 派手に複スレッド
{
srand(1);
for ( int i = 0; i < N2; ++i ){
data[i] = std::rand();
}
std::pair<int*,int*> firstHalf(data,data+N);
std::pair<int*,int*> secondHalf(data+N,data+N2);
DWORD thID;
HANDLE hThreads[2];
std::cout << "dual threads ..." << std::flush;
long t = GetTickCount();
// data[0..N]とdata[N..N2] を並行してソート
hThreads[0] = (HANDLE)_beginthreadex(0, 0, &process, &firstHalf, 0, (unsigned*)&thID);
hThreads[1] = (HANDLE)_beginthreadex(0, 0, &process, &secondHalf, 0, (unsigned*)&thID);
WaitForMultipleObjects(2, hThreads, TRUE, INFINITE);
// 前半と後半をマージ
std::inplace_merge(data, data+N, data+N2);
std::cout << GetTickCount() - t << std::endl;
CloseHandle( hThreads[0] );
CloseHandle( hThreads[1] );
}
delete[] data;
return 0;
}
