gpt4 book ai didi

c++ - 更快的 std::insert,或者,如何优化 Instruments 认为速度很慢的调用?

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:59:51 25 4
gpt4 key购买 nike

我正在尝试使用 Xcode 工具来寻找方法来加快我的应用程序的速度,使其足以在旧设备上良好运行。大部分时间花在音频回调上,具体来说:

Screenshot showing percentages

void Analyzer::mergeWithOld(tones_t& tones) const {
tones.sort();
tones_t::iterator it = tones.begin();
// Iterate over old tones
for (tones_t::const_iterator oldit = m_tones.begin(); oldit != m_tones.end(); ++oldit) {
// Try to find a matching new tone
while (it != tones.end() && *it < *oldit) ++it;
// If match found
if (it != tones.end() && *it == *oldit) {
// Merge the old tone into the new tone
it->age = oldit->age + 1;
it->stabledb = 0.8 * oldit->stabledb + 0.2 * it->db;
it->freq = 0.5 * oldit->freq + 0.5 * it->freq;
} else if (oldit->db > -80.0) {
// Insert a decayed version of the old tone into new tones
Tone& t = *tones.insert(it, *oldit);
t.db -= 5.0;
t.stabledb -= 0.1;
}
}
}

我感觉有点像一只狗,它终于捕获了一只松鼠,然后意识到它不知道下一步该做什么。我可以加快速度吗?如果可以,我该怎么做?

编辑:当然——tones_t 是 typedef std::list<Tone> tones_t;

Tone 是一个结构体:

struct Tone {
static const std::size_t MAXHARM = 48; ///< The maximum number of harmonics tracked
static const std::size_t MINAGE = TONE_AGE_REQUIRED; // The minimum age required for a tone to be output
double freq; ///< Frequency (Hz)
double db; ///< Level (dB)
double stabledb; ///< Stable level, useful for graphics rendering
double harmonics[MAXHARM]; ///< Harmonics' levels
std::size_t age; ///< How many times the tone has been detected in row

double highestFreq;
double lowestFreq;
int function;
float timeStamp;

Tone();
void print() const; ///< Prints Tone to std::cout
bool operator==(double f) const; ///< Compare for rough frequency match
/// Less-than compare by levels (instead of frequencies like operator< does)
static bool dbCompare(Tone const& l, Tone const& r) {
return l.db < r.db;
}
};

最佳答案

优化是一件复杂的事情。您可能需要尝试多种方法。

1:将 m_tones 和 tones 合并到一个新列表中,然后将该列表分配回 m_tones。请务必预先设置新列表的容量。

这将两个列表拷贝添加到混合中,但消除了所有插入。您必须测试它是否更快。

2:为不同的结构转储列表。您可以将 m_tones 存储为 std::set 而不是列表吗?

当您需要以有序的方式获取 m_tones 时,您需要调用 std::sort,但如果您不需要有序的迭代或者您只是不经常需要它,那么它可能会更快。

这些只是关于如何以不同方式思考问题的想法,您将不得不测试测试以查看哪个选项具有最佳性能。

关于c++ - 更快的 std::insert,或者,如何优化 Instruments 认为速度很慢的调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10516305/

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