通过引用返回静态向量很慢

时间:2018-12-04 15:16:49

标签: c++ c++11 return-by-reference

我正在设置一个缓存以绘制一些形状。我的方法如下:

我创建了一个如下所示的类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
        }

缓存文件如下:

缓存_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

缓存_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峰值,并且UI确实很滞后。

当我将OrbitCacheManager.h中的getCacheData方法重构为此时:

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);

一切都按预期开始。

我的问题是,为什么变化如此迅速地增加了速度?

我正在IOS上使用clang c ++ 11

1 个答案:

答案 0 :(得分:7)

您可能会通过引用将其返回,但是您将其存储在另一个对象中,因此仍然需要进行昂贵的复制:

 auto& cache = getCacheData(type);

您应该在通过引用返回的所有地方添加&,并希望保留引用而不是副本。