【问题标题】:Is there an efficiency hit for a constant formula in a C #define? [duplicate]C#define 中的常数公式是否会影响效率? [复制]
【发布时间】:2018-12-17 14:07:21
【问题描述】:

我正在阅读来自cpufreq_governor.h 的一些内核源代码并看到了这个:

/*
 * The polling frequency depends on the capability of the processor. Default
 * polling frequency is 1000 times the transition latency of the processor. The
 * governor will work on any processor with transition latency <= 10ms, using
 * appropriate sampling rate.
 *
 * For CPUs with transition latency > 10ms (mostly drivers with CPUFREQ_ETERNAL)
 * this governor will not work. All times here are in us (micro seconds).
 */
#define MIN_SAMPLING_RATE_RATIO         (2)
#define LATENCY_MULTIPLIER          (1000)
#define MIN_LATENCY_MULTIPLIER          (20)
#define TRANSITION_LATENCY_LIMIT        (10 * 1000 * 1000)

将最后一行改为阅读不是更有效吗:

#define TRANSITION_LATENCY_LIMIT        (10000000) /* (10 * 1000 * 1000) */

【问题讨论】:

  • 仅出于可读性考虑,最好保持原样。 (只是我的看法。),我的眼睛看到和理解10 * 1000 * 100010000000 更快。
  • 作为记录,标准的相关部分是这样的:c0x.coding-guidelines.com/6.6.html 注意它说的是“可以”,而不是“必须”在“翻译”(即编译)时评估。跨度>
  • 这里要注意的另一件事是编译器必须能够在编译时elsewhere(整数常量表达式)计算10 * 1000 * 1000,所以它没有在这种情况下这样做是很愚蠢的。

标签: c c-preprocessor


【解决方案1】:

将最后一行改为阅读不是更有效吗:

#define TRANSITION_LATENCY_LIMIT        (10000000) /* (10 * 1000 * 1000) */

很可能不会有任何区别。

任何半体面的编译器都应该能够在编译时计算10 * 1000 * 1000

【讨论】:

  • 好点。我整天都在 BASH 中,并在那里养成了我的编码习惯。 软件在 8 分钟内不让我接受你的回答
【解决方案2】:

问问自己:

您的建议中有多少个零(或替代方案,数字是多少)

#define TRANSITION_LATENCY_LIMIT (10000000)

累人的任务。这更加直观和简单(并且易于维护):

#define TRANSITION_LATENCY_LIMIT (10 * 1000 * 1000)

另外,(10 * 1000 * 1000) 更方便地表示 10 微秒(10 乘以百万分之一 (1000 * 1000) 秒)

此外,这里的效率无关紧要,因为它将由编译器计算。

【讨论】:

  • 需要注意的是,百万分之一秒是微秒,而不是毫秒。一毫秒是千分之一秒。
  • @Tau 已修复,谢谢
【解决方案3】:

毫无疑问,您可以更改它并获得更高效的代码,因为与加法和减法相比,乘法需要更多的 CPU 周期,但您会失去源代码的代码可读性。但是不要担心今天的编译器非常聪明,并且在编译时完成了它,这个过程被称为代码优化。

【讨论】:

  • 更高效的代码,因为乘法需要更多的 CPU 周期。不太可能是真的。计算将在编译时进行。
  • 肯定会在编译时进行计算。我的意思是,如果它没有在编译时完成并在运行时执行此操作(10 * 1000 * 1000),那么与此(10000000)相比,代码需要更多时间,因为乘法需要更多的 CPU 周期。
  • Susheel,离开 cmets 时请注意,如果你想引起某人的注意,(你给他们留下了评论)从他们的绰号开始,前面带有 @ 符号。 (例如@ryyker - comment)对于所有者回答或帖子下的 cmets,@ 符号不是必需的。系统会自动通知他们已为他们留下评论。关于您的回答,正如在其他一些 cmets 和答案中所见,这是一个有争议的观点。 (注意,我没有没有投反对票:))
猜你喜欢
  • 1970-01-01
  • 2016-06-09
  • 2011-10-19
  • 1970-01-01
  • 2013-06-18
  • 2011-12-19
  • 1970-01-01
  • 2010-12-17
  • 1970-01-01
相关资源
最近更新 更多