Медленный возврат статического вектора по ссылке - PullRequest
0 голосов
/ 04 декабря 2018

Я настраивал кеш для рисования некоторых фигур.Мой подход был следующим:

Я создал класс OrbitCacheManager.h, который выглядел так:

#ifndef OrbitCacheManager_h
#define OrbitCacheManager_h
#include <vector>
#include "cache_0_0.h"
#include "cache_1_0.h"
// many more includes

namespace Core {

   class OrbitCacheManager
   {
   public:
        static std::pair<float,float> getValue(const std::pair<int,int>& type, float phase, float param)
        {
            auto cache = getCacheData(type);
            // interpolate values based on phase and param
            return calculated_value;
        }
   private:
        static std::vector<std::pair<float,float>>& getCacheData(const std::pair<int,int>& type)
        {
            if (type.first == 0 && type.second == 0) return cache_0_0::values;
            if (type.first == 1 && type.second == 0) return cache_1_0::values;
            // etc
        }

Файлы кэша выглядят так:

cache_0_0.h :

#ifndef cache_0_0_h
#define cache_0_0_h 
#include <vector>
namespace Core {
class cache_0_0{
public:
    static std::vector<std::pair<float,float>> values;
};
};
#endif

cache_0_0.cpp :

#include "cache_0_0.h"
using namespace Core;
std::vector<std::pair<float,float>> cache_0_0::values = {
{ 0.000000, 1.000000 },     { 0.062791, 0.998027 }, // etc

Это должно быть выполнено так:

for (some phase range) {
    auto v = OrbitCacheManager::getValue(type, phase, param);
    // do something with v
}

Этот подход оказался очень медленным, профилировщик показал много пиков CPU, а пользовательский интерфейс был очень медленным.

Когда я реорганизовал метод getCacheData в OrbitCacheManager.h к этому:

static std::vector<std::pair<float,float>>* getCacheData(const std::pair<int,int>& type) 
{
    if (type.first == 0 && type.second == 0) return &(cache_0_0::values);

Все начало работать как положено.

Мой вопрос: почему это изменение так резко увеличило скорость?

Я использую clang c ++ 11 на IOS

1 Ответ

0 голосов
/ 04 декабря 2018

Возможно, вы возвращаете его по ссылке, но вы храните его в другом объекте, следовательно, все равно делаете дорогостоящую копию:

 auto& cache = getCacheData(type);

Вы должны добавлять & везде, куда возвращаетесь по ссылке, и ожидаете, чтосохраните ссылку, а не копию.

...