【发布时间】:2019-05-06 01:29:41
【问题描述】:
我正在设置一个缓存来绘制一些形状。我的方法如下:
我创建了一个类似 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 峰值,并且 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
【问题讨论】:
-
您应该说明您用于编译代码的编译器选项。如果您正在运行未优化的代码,那么您显示的时间是没有意义的。
-
在 for range 循环中使用
auto与auto &存在类似问题,可能不是重复但可能相关
标签: c++ c++11 return-by-reference