gpt4 book ai didi

c - K&R 练习题对原始问题的回答

转载 作者:行者123 更新时间:2023-12-04 06:42:15 27 4
gpt4 key购买 nike

我一直试图解决 K&R 问题 7-8 的解决方案,直到我找到 this solution (with the original problem)就在这个网站上。我无法对答案发表评论(可能是因为它的年龄);我实际上可以对该问题进行输入的唯一方法是发布答案,我认为这是不合适的。所以我决定根据所选的“答案”创建这个高度相关的问题,这对我来说似乎合乎逻辑,直到我达到这一点(关于将函数实现为宏):

"Repeat that as a macro very often and the 'space saving' rapidly becomes a cost as the bit masking has a fixed size."



唯一的问题是函数调用也需要时间。 “跳转”到函数位置,为局部变量留出存储空间,然后实际计算比较,都需要时间。

那么究竟是如何实现一个宏来测试字符的 ASCII 值比第一个包含表查找的函数慢(考虑到这一点)?

一个函数调用怎么可能比比较两个整数(其中一个已经在内存中,另一个是常量)花费的时间更少?在我看来,重复调用函数和宏,随着时间的推移,仍然会导致宏更快。

我的思维方式有问题吗?我认为它必须是因为它没有在原始问题中提出。

如果有人对此有所了解,我会很高兴。

最佳答案

首先,请注意他们提到的成本是大小,而不是速度。举个例子,让我们假设宏扩展到 16 个字节的代码。让我们进一步假设该函数编译为 32 字节的代码,并且调用该函数需要 6 字节的代码(当然,这些都不能保证,但它们可能至少在 32 位正确的一般范围内代码)。

在这种情况下,如果你使用一个函数,但只从一个地方调用它,你最终会得到 38 字节的代码。如果您改用宏,则只能获得 16 个字节的代码,从而节省了 22 个字节。如果你在两个地方使用宏,你会得到 32 字节的代码,而如果你使用一个函数,你会得到 44 字节——仍然是一种节省,但更小。提前一点,假设您在代码中的 10 个不同位置使用了它。在这种情况下,宏将占用 160 个字节,但函数将只占用 92 个字节。

在现代处理器上,我还可以看到一个相当合理的论点,即函数也可以更快。大多数现代处理器使用缓存。如果您使用的函数足够多,以至于在调用它时它通常会在缓存中,那么这比使用宏要快得多,每次使用代码时,您(更多)可能必须获取再次从内存中提取代码。原因很简单:现代处理器的运行速度比内存快得多。

即使充其量,您也可以计划至少 50 ns 的延迟以从内存中获取一些数据(75-100 ns 是相当常见的)。我们假设平均为 75 ns。典型的现代 CPU 每个时钟执行大约 1.8 条指令,并且在(例如)2.5 GHz 时,时钟周期时间为 0.4 ns。这意味着在 75 ns 内,它可以(平均)执行 75/0.4*1.8 = 337.5 条指令。调用、执行和从我们这里讨论的函数返回大约有六条指令的数量级——所以在一个紧密的循环中,当你从内存中获取宏的代码时可以从缓存中执行该函数大约 56 次。

当然,如果你只在一个紧密的循环中执行它,宏大部分时间也会在缓存中。当您从代码中足够多的不同位置调用该函数时,该函数的优势就出现了,即使在循环的第一次迭代中,它通常也会在缓存中,而宏通常不会出现这种情况。

关于c - K&R 练习题对原始问题的回答,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4094336/

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