У меня есть следующая программа на C ++:
void testSpeed(int start, int end)
{
int temp = 0;
for(int i = start; i < end; i++)
{
temp++;
}
}
int main() {
using namespace boost;
timer aTimer;
// start two new threads that calls the "testSpeed" function
boost::thread my_thread1(&testSpeed, 0, 500000000);
boost::thread my_thread2(&testSpeed, 500000000, 1000000000);
// wait for both threads to finish
my_thread1.join();
my_thread2.join();
double elapsedSec = aTimer.elapsed();
double IOPS = 1/elapsedSec;
}
Таким образом, идея состоит в том, чтобы проверить скорость процессора в терминах целочисленных операций в секунду (IOPS).Существует 1 миллиард итераций (операций), поэтому на 1 ГГц процессоре мы должны получать около миллиарда целочисленных операций в секунду, я полагаю.
Я предполагаю, что больше потоков = больше целочисленных операций в секунду.Но чем больше потоков я пытаюсь, тем меньше операций в секунду я вижу (у меня больше ядер, чем потоков).Что может быть причиной такого поведения?Это потоки над головой?Может быть, мне стоит попробовать гораздо более длинный эксперимент, чтобы увидеть, действительно ли помогают потоки?
Спасибо!
ОБНОВЛЕНИЕ : Итак, я изменил цикл, чтобы он выполнялся 18 миллиардов раз,и объявил временную переменную.Также добавлен еще один метод testSpeed с другим именем, так что теперь один поток выполняет оба метода один за другим, в то время как два потока получают каждый метод;поэтому не должно быть никаких проблем с синхронизацией и т. д. И ... по-прежнему никаких изменений в поведении!однопоточный быстрее по таймеру.Ааа!Я нашел присоску, видимо, таймер блефует.Два потока занимают половину времени, но таймер сообщает мне, что однопоточный запуск был на две секунды быстрее.Я сейчас пытаюсь понять, почему ... Спасибо всем!