优化环路C
Optimizing For Loops C++
我具有通过向量循环以找到给定动物并返回其栖息地的小功能。我需要优化它,但是我正在用自己的工作来击中死胡同。我突然出现的三件事是size_t
,i++
,我通过向量循环的事实。我读到size_t
非常适合具有较大尺寸索引的数组。我知道pre-increment
比post-increment
更好,因为它更改了原始值,而不是创建温度和增加。但是,无论如何,编译器通常会优化这种小差异。最后,我认为的最后一件事是,该向量可能会被毫不犹豫,因此表现效果。我正在考虑通过动物的物种变量对矢量进行排序,然后将其移植到BST
中进行搜索,因为时间复杂性为O(log(n))
。这是我正在使用的代码:
string GetAnimalHabitat(vector<Animal> animals, string species)
{
for (size_t i = 0; i < animals.size(); i++)
{
if (animals[i].species == species)
{
return animals[i].habitat;
}
}
return "Animal not within records.";
}
有可能缺少任何可以改善此功能的东西吗?任何技巧都很棒。谢谢!
a std::map
肯定比在这里循环循环更好地工作:
string GetAnimalHabitat(const map<string, string>& animals, const string& species)
{
auto search = animals.find(species);
if (search != animals.end())
return search->second;
return string("Animal not within records.");
}
但是,它需要首先构建地图。但是,曾经构建它就足够了,您只需要向其添加新的密钥对:
map<string, string> build_map(const vector<Animal>& animals)
{
map<string, string> ret;
for (const auto& x : animals)
ret[x.species] = x.habitat;
return ret;
}
您可以做的一件事是减少次数。
size_t vectorSize = animals.size();
for (size_t i = 0; i < vectorSize; i++)
{
if (animals[i].species == species)
{
return animals[i].habitat;
}
}
另一个未成年人将是将i++
更改为++i
。其目的是避免在每次增量时将i
的值存储在寄存器中。
在高级别上,每次调用此功能时,您都希望停止对向量及其所有元素进行完整副本。如果您需要优化,我假设向量很大,那么为什么不传递对const vector的引用?
第二,另一个问题是矢量的元素匹配您的输入字符串有多少个元素?如果只是几个,那么扫描整个向量正在加载大量内存,只是为了查看它以决定您不需要它。由于您在第一场比赛之后返回,因此有理由认为每种物种中最多都有一个,在这种情况下,关联容器更好。
某些延迟敏感的位置数据分配到不同的组中,因此无需"过滤"。只需查看您关心的一组事情,而只是处理这些事情。
要考虑的另一件事是,字符串比较比整数比较要慢得多。您可以将物种预先将物种预先加入类,并在循环前放置物种参数,并比较哈希。如果它们相等,请比较字符串以确保它是真正的匹配。
,但我的猜测是您大部分时间都花在复制输入和输出。
std::unordered_map
是最有意义的,因为顺序不重要
string GetAnimalHabitat(const std::unordered_map<string, string>& animals, const string& species)
{
auto search = animals.find(species);
if (search != animals.end())
return search->second;
return string("Animal not within records.");
}
但是,它需要首先构建地图。但是,曾经构建它就足够了,您只需要在其中添加新的密钥对即可。请注意,第一次通过一个空的unordered_map进入,然后通过新值的向量和当前地图:
:build_map(const std::vector<Animal>& animals, std::unordered_map<string_string> * ret)
{
for (const auto& x : animals)
ret[x.species] = x.habitat;
}
- 空基优化子对象的地址
- 关闭||运算符优化
- 如何解决gcc编译器优化导致的centos双编译器设置中的分段错误
- 普通环路未使用gcc 4.8.5自动矢量化
- 返回值优化:显式移动还是隐式
- 人脸跟踪arduino代码的优化
- 使用仅使用一次的变量调用的复制构造函数.这可能是通过调用move构造函数进行编译器优化的情况吗
- 纯函数,为什么没有优化
- 为什么大多数 pair 实现默认不使用压缩(空基优化)?
- 如何以优化的方式同时迭代两个间距不相等的数组
- 小字符串优化(调试与发布模式)
- 浮点定向舍入和优化
- Visual Studio 调试优化如何工作?
- 为什么开关的优化方式与 c/c++ 中的链接不同?
- 线性优化目标函数中的绝对值
- GCC 会优化内联访问器吗?
- gcc 如何优化此循环?
- 如何防止 CUDA-GDB 中的<优化输出>值
- 为什么我的程序在 O0 和 O2 的优化级别返回不同的结果
- 优化环路C