gpt4 book ai didi

c++ - 为什么我的分析类非常慢?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:40:21 26 4
gpt4 key购买 nike

我从来没有做过分析。昨天我用静态时间表(一个 map )编写了一个 ProfilingTimer 类用于时间存储。

构造函数存储起始刻度,析构函数计算耗时并将其添加到 map 中:

ProfilingTimer::ProfilingTimer(std::string name)
: mLocalNameLength(name.length())
{
sNestedName += name;
sNestedName += " > ";

mStartTick = Platform::GetTimerTicks();
}

ProfilingTimer::~ProfilingTimer()
{
long long totalTicks = Platform::GetTimerTicks() - mStartTick;

sTimetable[sNestedName] += totalTicks;

sNestedName.erase(sNestedName.length() - mLocalNameLength - 3);
}

在我想要分析的每个函数(或{block})中我需要添加:

ProfilingTimer _ProfilingTimer("identifier");

当我从 Visual C++ 2010 Professional 构建发布版本时,此分析工作一切正常。但是,当我以 Debug 模式构建时,fps 大幅下降(从 63 下降到 ~20)。

这些是我在打印时间表(调试版本)时得到的数字:

Update() > Tower::Update > : 2551 ms (84100m%)
Update() > Tower::Update > Tower::Update1 > : 1313 ms (43284m%)
Update() > Tower::Update > Tower::Update1 > Tower::FindNewTarget > : 6 ms (204m%)
Update() > Tower::Update > Tower::Update1 > Tower::HasTargetInRange > : 5 ms (184m%)
Update() > Tower::Update > Tower::Update2 > : 659 ms (21756m%)
Update() > Tower::Update > Tower::Update2 > Tower::HasTargetInRange > : 5 ms (187m%)

Update1 和 Update2 分别乘以 Update 的前半部分和后半部分。为什么它们加起来不达到 84.1 %?

这 84% 仍然是一个巨大的数字 - 在发布版本中我得到了这个输出:

Update() > : 770 ms (1549m%)
Update() > Tower::Update > : 722 ms (1452m%)
Update() > Tower::Update > Tower::FindNewTarget > : 44 ms (89m%)
Update() > Tower::Update > Tower::HasTargetInRange > : 92 ms (187m%)

1.4% 而不是 84.1%。这是一个巨大的差异!

谁知道为什么?

编辑:我想发布比调试快得多,但为什么这个分析如此耗时? std::map 是在浪费时间还是我做错了什么?

编辑:更新了代码。不需要启动,现在存储 mLocalName 的长度而不是实际的字符串。

最佳答案

您的代码存在一些性能问题。

  1. 您不必要地在 ProfilingTimer 构造函数中构造了一个 std::string。我建议使用 const char* 作为参数并使用自定义 Twine/Rope结构来做你的追加。
  2. 为什么 mLocalName 存在?直接引用 name 即可。
  3. 如前所述,永远不要在 Debug模式下进行分析。这是毫无用处的。
  4. map 在实践中实际上很慢。我建议使用哈希表。不幸的是,实现是特定于编译器的。如果您使用的是 Microsoft,我相信他们有 unordered_map 可供您使用。
  5. 不要执行 sTimetable[sNestedName] = 0;,而是使用您已经检索到的迭代器。

    Timetable::iterator loc = sTimetable.find(sNestedName);
    if(loc == sTimetable.end())
    sTimetable[sNestedName] = 0;

附录:我上次检查时,Visual Studio 附带了一个探查器。为什么不直接使用它呢?

关于c++ - 为什么我的分析类非常慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4233922/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com