最近の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; }