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

Posted

技术标签:

【中文标题】什么是样板代码、热点代码和热点?【英文标题】:What is Boilerplate code, Hot code and Hot spots? 【发布时间】:2011-10-27 13:58:34 【问题描述】:

我知道这些术语是在绩效成就/优化的背景下使用的。

最近一直在努力,并尝试搜索;但没有得到任何示例,这些示例清楚地阐述/描述了这些概念,并在现实世界的开发场景中实现了这些问题/概念。

有人可以详细解释这些术语、示例场景以及可能使用这些概念和术语的位置。

谢谢。

【问题讨论】:

程序员堆栈的问题? 【参考方案1】:

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

另一方面,“热点”是指代码中多次执行的部分,因此其性能对整体应用程序性能非常重要。通常一个热点是通过实际的分析来识别的:如果它被执行了很多次,它就不是一个热点,但是它是如此的微不足道,以至于它对性能的影响是最小的。

【讨论】:

【参考方案2】:

Boilerplate code

“热代码”是可扩展且编写良好的代码

“热点”是一个活跃的区域。它们是热点,因为它们是经常执行的代码。

【讨论】:

【参考方案3】:

“热点”的一个定义是程序计数器花费大部分时间的代码区域。 一个相关的术语是“瓶颈”,虽然定义不明确,但通常是指本地化到函数、例程或方法的代码,这会导致花费比必要时间更多的时间。

这两个术语都非常具有误导性,因为有一个巨大的不成文假设。 假设是没有机会加速不是热点或瓶颈的程序。 加速机会可能比这更分散,如果没有找到并修复它们,它们就会成为性能限制因素。

让我举个例子。 最近在做一个300行左右的C++程序的时候,拿了十个stackshots,因为我想看看怎么能加快速度。 其中四个堆栈截图如下所示:

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% 的加速。 (注意:当谈到时间安排时,我并不在乎“精确”。我想做的是找到问题。)

现在人们可能很容易不同意这种解决问题的方法,但是您可以看到我是如何发现问题是什么的,对吧?

好的,那么“热点”和“瓶颈”在哪里? 显然,索引运算符函数中有一个热点,但问题出在哪里? (实际上甚至不是,因为它是三个不同的功能。) 这是否意味着我应该尝试加快该例程? 我什至不拥有它!

是否存在某种“慢程序”形式的瓶颈? 不! 没有特别慢的例程或“糟糕的算法”。

我所做的是描述它正在做什么(“它在某些例程中建立索引。”)该描述在大部分时间都适用。

对于这些事情,我能想到的最好的术语是“时间消耗”,因为它花费了很大一部分时间做一些真正不需要做的事情。

More about terminology and popular misconceptions.

【讨论】:

【参考方案4】:

阅读定义:https://en.wikipedia.org/wiki/Boilerplate_code 由https://projectlombok.org/处理

【讨论】:

【参考方案5】:

我的假设是您已经对术语“样板”有足够的定义。我可能希望通过一个例子来支持你所拥有的。 来自 Java 背景并最近转向 Scala,您意识到在 Java 中,您不能编写没有分号 (;) 的语句。此外,为可能在生产中运行的程序编写数千条语句并不罕见。你的猜测和我的一样好,你最终会编写大量重复的低影响代码,但它恰好是 Java 编译器需要的代码。 Scala 是一种简洁的语言,因为它减少了编写样板代码的需要。您不必在 Scala 中编写分号。希望这足够简单

【讨论】:

以上是关于什么是样板代码、热点代码和热点?的主要内容,如果未能解决你的问题,请参考以下文章

代码质量的几点新思考

如何在Eclipse中调试openjdk 9(主要是热点)源代码?

运行越来越快的Java热点代码

Android11 热点配置信息保存分析

Android11 热点配置信息保存分析

jit编译