优化环路C

Optimizing For Loops C++

本文关键字:环路 优化      更新时间:2023-10-16

我具有通过向量循环以找到给定动物并返回其栖息地的小功能。我需要优化它,但是我正在用自己的工作来击中死胡同。我突然出现的三件事是size_ti++,我通过向量循环的事实。我读到size_t非常适合具有较大尺寸索引的数组。我知道pre-incrementpost-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;
}