我知道这些术语是在性能成就/优化上下文中使用的。
最近一直在研究这个问题,并尝试搜索;但是没有得到任何例子,能够清晰地阐述/描述这些概念以及这些问题/概念在现实世界开发场景中的实现。
谁能彻底解释一下这些术语,示例场景,以及这些概念和术语可能使用的地方?
谢谢。
"Boilerplate"与性能无关:它只是指定义应用程序或使用某些框架所需的标准代码。它的代码很可能在每个应用程序中都是相同的。
另一方面,"热点"意味着代码的一部分被执行了很多次,因此它的性能对整个应用程序的性能影响很大。通常一个热点是由实际的分析来确定的:如果它被执行了很多次,它就不是一个热点,但是它对性能的影响非常小。
样板代码
"hot code"是可伸缩的好代码
"热点"是一个活动激烈的区域。它们是热点,因为它们是频繁执行的代码。
"热点"的一个定义是程序计数器花费相当一部分时间的代码区域。一个相关的术语是"瓶颈",虽然定义不明确,但通常指的是本地化到函数、例程或方法的代码,这些代码会导致花费比必要时间更多的时间。
这两个术语都很容易误导人,因为有一个巨大的不成文的假设。我们的假设是,没有机会加速一个不是热点或瓶颈的程序。加速机会可能比这更分散,如果它们没有被发现和修复,它们就会成为性能限制因素。
让我举个例子。最近,当我在编写一个300行左右的c++程序时,我拍了10张堆栈图,因为我想看看如何提高它的速度。其中四个堆叠图是这样的:
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%的加速。(注意:当涉及到时间的时候,我并不在乎"精确"这个词。我想做的是找到问题)
现在人们可能不同意这种解决问题的方法,但是您可以看到我是如何检测问题所在的,对吧?
好的,那么"热点"在哪里,"瓶颈"在哪里?显然,在索引操作符函数中有一个热点,但这是问题所在吗?(实际上并不是这样,因为它是三个不同的函数。)这是否意味着我应该试着把这个程序做得更快?我甚至都不拥有它!
是否存在一些"慢例程"形式的瓶颈?不!没有特别的程序是慢的,或者是一个"坏算法"。
我所做的是做一个描述它正在做什么("它在某些例程中索引"),这个描述在很大程度上适用。
对于这些事情,我能想到的最好的术语是"时间消耗",因为它花费了大量的时间去做那些实际上不需要做的事情。
关于术语和流行误解的更多信息
阅读定义:https://en.wikipedia.org/wiki/Boilerplate_code
通过https://projectlombok.org/
我的假设是您已经对术语"样板"有了足够的定义。我可能希望通过一个例子来支持你的观点。从Java背景到最近迁移到Scala,您意识到在Java中,您无法编写没有分号(;)的语句。此外,为可能在生产环境中运行的程序编写数千条语句并不罕见。你的猜测和我的一样好,你最终写了很多重复的低影响的代码,但它恰好是Java编译器需要的代码。Scala是一种简洁的语言,它减少了编写样板代码的需要。在Scala中不必编写分号。希望这足够简单