什么是样板代码,热代码和热点?

10
我知道这些术语通常用于性能的实现/优化方面。最近一直在研究并尝试搜索,但没有找到任何例子清晰地阐述/描述这些概念,并意识到它们在真实世界的开发场景中的问题/概念。有人可以详细解释这些术语、示例场景以及这些概念和术语可能被使用的地方吗?谢谢。

1
程序员堆栈的一个问题? - Wivani
5个回答

15

"样板代码"与性能无关:它只是指定义应用程序或使用某些框架所需的标准代码。这些代码在每个应用程序中很可能是相同的。

另一方面,“热点”意味着代码的某一部分被执行多次,因此它的性能对整个应用程序的性能非常重要。通常通过实际剖析来确定热点:如果一个代码被执行多次但其对性能的影响很小,则不是热点。


4

样板式代码

"热代码"是指可扩展的、编写良好的代码。

"热点"是指活动强度很高的区域。它们是热点,因为它们是经常执行的代码。


3
"热点"的一个定义是程序计数器花费大量时间的代码区域。 相关术语是"瓶颈",虽然没有明确定义,但通常指的是局部于函数、例程或方法的代码,导致花费比必要的更高的时间比例。
这两个术语都非常误导人,因为有一个巨大的未写明的假设。 这个假设是,没有机会加速程序,而这些机会不是热点或瓶颈。 加速机会可能比那更分散,如果它们没有被发现和修复,它们就成为性能限制因素。
让我举个例子。 最近,在处理约300行的C++程序时,我进行了十次堆栈快照,因为我想看看如何加速它。 其中四个堆栈快照看起来像这样: "
CTypedPtrArray<CPtrArray,COperation *>::operator[]() line 1555 + 23 bytes
TcProcess() line 246 + 14 bytes ---> COperation* pOp = oplist[i];
CMhAck::Handler() line 165
doit() line 297 + 12 bytes
main() line 318

CTypedPtrArray<CPtrArray,CJob *>::operator[]() line 1555 + 23 bytes
SchProcess() line 212 + 14 bytes ---> pJob = joblist[i];
COpAck::Handler() line 145
doit() line 297 + 12 bytes
main() line 318

CTypedPtrArray<CPtrArray,CTask *>::operator[]() line 1555 + 23 bytes
TcProcess() line 249 + 18 bytes ---> pTask = pOp->tasks[pOp->iCurTask];
CMhAck::Handler() line 165
doit() line 297 + 12 bytes
main() line 318

CTypedPtrArray<CPtrArray,CTask *>::operator[]() line 1555 + 23 bytes
COperation::~COperation() line 57 + 15 bytes ---> CTask* p = tasks[i];
COperation::`scalar deleting destructor'() + 37 bytes
TcProcess() line 259 + 28 bytes
CTskAck::Handler() line 193
doit() line 297 + 12 bytes
main() line 318

该程序总共花费了20秒。 这些堆栈样本告诉我大约40%的时间,即8秒,花费在数组类的索引运算符上。 这告诉我,如果我可以更直接地进行索引,而不是通过函数调用,我可以将运行时间从20秒降至12秒左右。 加速比将是20/12 = 1.67,或者大约加速了67%。 (注意:当涉及到计时时,我并不关心“精确”,我想做的是找到问题。)
现在,有人可能很容易地反对这种解决问题的方法,但你可以看到我如何检测出问题所在,对吧?
好的,那么“热点”在哪里,“瓶颈”在哪里? 显然,在索引运算符函数中存在热点,但问题就在那里吗? (实际上,它甚至不是那样,因为它是三个不同的函数。) 这是否意味着我应该尝试使该例程更快? 我甚至没有这个例程!
是否存在某个“慢例程”的瓶颈? 没有! 没有特定的例程是缓慢的或者有“糟糕的算法”。
我所做的是对它正在执行的内容进行描述(“它正在特定例程中进行索引。”),其中这种描述适用于大部分时间。
我能想到的最好术语是“时间消耗”,因为它花费了大量时间做一些不必要的事情。 更多关于术语和流行误解的信息。

0

0

我假设您已经对“样板文件”这个术语有足够的定义。我想通过一个例子来支持您的理解。

如果您来自Java背景并最近转向Scala,您会意识到在Java中,您不能编写没有分号(;)的语句。此外,为了运行程序,编写数千条语句也不是什么稀奇事。你猜得没错,你最终会编写很多重复的低影响代码,但这恰好是Java编译器所需的代码。Scala是一种简洁的语言,因为它减少了编写样板代码的需要。在Scala中,您不必编写分号。希望这足够简单明了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接