2016-10-31 5 views
0

ребятC++/CLI код становится медленнее внутри цикл

Я пишу код в C++/CLI с помощью Visual Studio 2015.

Прямо сейчас, я столкнулся с нечетной проблемой. Мой код работает медленнее, поскольку он выполняет итерацию внутри цикла. Мой код работает в BackgroundWorker, и это выглядит следующим образом:

for(Int32 d = 0; d < 365; d++){ 
    DoStuff1(); 
    DoStuff2(); 
    DoStuff3(); 
    DoStuff4(); 
}; 

В дни «d» пройти мимо, код работает медленнее, то есть, это занимает больше времени, чтобы перейти от дня «г» в день «D + 1 ». Я попытался найти источник проблемы, используя класс StopWatch «вокруг» каждого из методов DoStuff. Я сделал это так:

timeOperations->StartNew; 
DoStuff1(); 
timeOperations->Stop();      
milliSec = timeOperations->ElapsedMilliseconds; 
Print(milliSec); 

Глядя на миллисекундах для каждого метода DoStuff, я могу видеть, что время вычисления не меняется день «D» повторяется. То есть время вычисления для DoStuff1 одинаково для «d = 0», «d = 1», ..., «d = 70» и т. Д. Такая же картина происходит и для других методов DoStuff, только с разным временем вычислений.

Кроме того, я также попытался обертывание секундомера вокруг всех методов DoStuff, как это:

for(Int32 d = 0; d < 365; d++){ 
    timeOperations->StartNew; 
    DoStuff1(); 
    DoStuff2(); 
    DoStuff3(); 
    DoStuff4(); 
    timeOperations->Stop();      
    milliSec = timeOperations->ElapsedMilliseconds; 
    Print(milliSec); 
}; 

Это также приводит к тому же времени вычисления для повседневной. Несмотря на это, я могу ясно видеть, что код идет медленнее и медленнее, так как день «d» повторяется.

Я не знаю, что происходит. Я надеюсь, что некоторые из вас, ребята, решили эту проблему раньше и могут дать мне несколько советов.

Я ценю любую информацию о том, как решить эту проблему.

Заранее спасибо.

+0

Я не уверен, но не должен 'timeOperations-> StartNew' быть' timeOperations-> StartNew() '? В Python это ничего не сделает (вызов функции, а не вызов функции), и это может объяснить вашу ошибку. –

+0

Эй, Жан. Я попробовал timeOperations-> StartNew(), и ничего не изменилось. – Bruno

+0

простите меня за то, что вы дали ложные надежды :), но из ответа кажется, что я не был слишком далек от истины ... –

ответ

1

У вас есть две проблемы здесь:

  1. Ваш код становится медленнее, как он перебирает.
  2. Добавленный вами временной код показывает одинаковые результаты для каждой итерации.

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

Вы никогда не перезапускаете свой секундомер.

Поскольку у вас есть это прямо сейчас, у вас есть один секундомер, который вы создаете изначально (где-то в коде, который вы не показываете), вы останавливаете его, получаете время, но вы никогда не начинаете его снова. Вот почему секундомер показывает одинаковые результаты.

StartNew - статический метод в классе секундомера. Вы должны называть его статическим для создания и запуска нового секундомера.

timeOperations = Stopwatch::StartNew(); 

В качестве альтернативы, вы можете сохранить один и тот же объект секундомера и restart таймер.

timeOperations->Restart(); 
+0

Спасибо, Дэвид. Использование timeOperations-> Секундомер :: Перезагрузка(); наряду с timeOperations-> Секундомер :: StartNew(); также работал. Я бы потратил некоторое время, пытаясь решить это самостоятельно. – Bruno

+0

Выполнение обоих не нужно. Либо перезапустите свой существующий, либо сохраните новый, который вы создаете, не нужно делать то и другое. –

+0

Ты снова прав. Бесконечно благодарен – Bruno