我仍然很新,所以请耐心等待我,我的问题并不是争论性或小事,但在某些阅读中,有些东西让我感到奇怪。
我假设当计算机速度慢且使用正确的变量类型的内存很昂贵时,这比现在更加必要。现在人们似乎已经放松了一点,更容易找到记忆。例如,您可以在任何地方看到此示例代码:
for (int i = 0; i < length; i++)
INT? (-2,147,483,648到2,147,483,648)长度?不是字节(0-255)更好的选择?
所以我很好奇你的意见以及你认为最佳实践,我讨厌认为只会因为首字母缩略词“int”对于初学者来说更直观......或者记忆力变得如此便宜以至于我们真的不需要关心这些小事,因此我们应该长时间使用,以便我们可以确定所使用的任何其他数字/类型(在合理范围内)是否可以自动投射?
......或者我只是因为对这些事情的关注而感到愚蠢?
答案 0 :(得分:10)
Luca Bolognese在他的博客中发布了this。
以下是相关部分:
答案 1 :(得分:9)
使用小于CPU本机寄存器大小的变量实际上可以导致发出更多代码。
正如另一张海报所说,不要担心微观优化。如果您遇到性能问题,请先查看个人资料。 10次你的性能问题中有9次不会是你想象的那样。
答案 2 :(得分:3)
不,我认为你不傻,这是一个很好的问题!
我的观点是使用强类型变量是最佳实践。在您的示例中,变量 i 始终为正,因此它可以是 unsigned int 。
在开发程序时,我们需要考虑:1)大小2)速度和3)程序员的成本。这些并不是相互排斥的,有时我们会根据速度进行权衡,当然那些最能做到这一点的人(优秀的程序员)比初学者花费更多。
还要记住计算机X上最快的是计算机B可能会更慢。它是16位,32位,64位等操作系统吗?在许多情况下,我们希望变量在字边界上对齐以提高速度,以便使用小于单词的变量不会最终节省任何空间。
因此,使用尽可能小的变量并不是必要,但最好的做法是对最佳使用类型做出明智的选择。
答案 3 :(得分:2)
现在通常记忆很便宜,因为您不必担心它,您可以关注更重要的编程细节。把它想象成管理记忆,你需要做的就越少,你的整体效率就越高。最终它与抽象程度有关,如果你不需要控制所有齿轮和轮子的工作方式,那么最好不要修改它们。
在实践中,您通常会使用整数或多头(如果您需要额外的尺寸)。除非我在优化,否则我不会关心这些日子。并记住优化的黄金法则除非必须,否则不要进行优化。首先编写代码,然后根据需要进行优化。
另一种类似的情况是在设计数据库模式时。我经常看到人们设计一个模式,只允许他们在NVARCHAR列上需要它们。对我来说,这是荒谬的,因为它是一个可变长度的列,所以你不会浪费空间,并给自己足够的空间,你可以避免在路上遇到问题。我曾经为一家在网站上进行内部登录的公司工作过;一旦我升级到IE8,网站开始崩溃。经过一些调查后,我发现日志模式只允许32个字符作为浏览器id字符串,但是当使用IE8(使用Vis Studio和其他扩展)时,浏览器id字符串增长到32以上并导致一个问题,导致网站无法正常工作。当然,负责这一点的开发人员可能会有更严格的长度检查和更好的错误处理,但是允许256而不是32不仅可以防止崩溃,而且我们不会截断数据db。
我不是建议您使用字符串,并且Int64用于所有数据类型(不超过我建议您将所有sql列设置为NVARCHAR(4000))因为您失去了可读性。但是选择合适的类型并给自己很多填充。
答案 4 :(得分:2)
循环索引等局部变量很便宜。你一次在堆栈上有多少帧?五十?一百?一千?使用一千个int
计数器而不是一千个byte
计数器的开销是多少? 3K?当事实证明其中一些阵列需要超过255个元素时,是否可以节省3K的返工值?
如果要分配数千万这些东西,那么挤压位数可能是有意义的。对于当地人来说,这是一种虚假的经济。
另一个因素是该类型与读者沟通的内容。无论好坏,人们对int
的解释都很少;但当他们看到byte
时,他们倾向于将其解释为特定于字节的东西,例如来自流的二进制数据,可能是像素,或者需要通过编码器运行的流来转换它成一个字符串。使用一个字节作为一个循环计数器会让你的代码的许多读者停下来,他们停下来想知道,“等等,为什么这是一个字节而不是一个int?”
答案 5 :(得分:2)
考虑到这个说明可能会对您有所帮助:
运行时优化性能 32位整数类型(Int32和 UInt32),所以使用这些类型 计数器和其他频繁访问 积分变量。对于浮点数 操作,Double是最多的 因为那些有效的类型 操作由硬件优化。
注意:我认为这对于x86机器来说没问题,但对于x64我不知道。