2016-12-17 2 views
0

У меня есть функция рендеринга, которая выполняется сотни раз в секунду, и она сообщает мне, сколько миллисекунд каждый кадр принимает для рисования.Расчет средних значений вектора с увеличением размера

Я сделал функцию для вычисления текущей средней скорости рендеринга всех кадров, которая использует std :: vector для хранения всех предыдущих кадров.

Однако каждый раз, когда я запускаю свою программу, вектор, который хранит средние значения, становится огромным и занимает все большее количество памяти, а также замедляет мою программу почти в 10 раз (скорость вытягивания).

функция Усреднение (обратите внимание, я C++ для начинающих):

double average(std::vector<double> input_vector) 
{ 
    double total = 0; 

     for(unsigned int i = 0; i < input_vector.size(); i++) 
     { 
      total += input_vector.at(i); 
     } 

    return (total/(double)input_vector.size()); 
} 

Может кто-то помочь мне исправить это?

Спасибо

+1

Передайте вектор по ссылке, а не по значению: 'double average (std :: vector & input_vector)' - этот код делает копию всего вектора каждый раз. Oy. –

+1

Кроме того, используйте 'operator []' вместо 'at'. Или просто используйте 'std :: accumulate' напрямую. Это можно распараллелить автоматически в C++ 17 бит. (Также с libstdC++, но это не то, что вы используете.) –

+0

Спасибо вам за советы. Я обязательно буду помнить их в будущем! – 0x22fe

ответ

3

Учитывая определение среднего арифметического является sum(n)/count(n) вам не нужно хранить все значения n для того, чтобы пересчитывать работает средняя, ​​вам нужно только текущий sum и текущий count, как так :

double runningMean(double newValue) { 
    static double sum = 0; 
    static double count = 0; 

    count++; 
    sum += newValue; 

    return sum/count; 
} 

No vector необходимо вообще.

Смежные вопросы