我有一些包含大量常量的库。使用该库的任何应用程序都将使用这些常量中的一些或不使用这些常量。所以,我想知道是否使用lambda表达式(例如):
public static Milliseconds {
public static int OneSecond => 1000;
public static int TwoSeconds => 2000;
.
.
}
在文件大小(exe或dll)或运行时速度方面效率更高:
public static Milliseconds {
public const int OneSecond = 1000;
public const int TwoSeconds = 2000;
.
.
}
我确定任何差异都是微不足道的。我不打算挤出最后一个字节或纳秒秒,我只是好奇。谢谢。
答案 0 :(得分:3)
属性方法实际上创建了类似get_OneSecond()
的方法,它返回存储在程序集中的数字。
第二种const方法不会创建任何成员,只要在编译时使用它,就会内联常量的值。
因此,方法1将占用更多空间并且将更少"效率更高",即需要执行更多指令。当然,我们谈论的是不明显的微小差异。
然而,同时方法1给你两件事:
它提供了更大的灵活性,允许您封装逻辑。例如,有一天你可以以另一种方式获取OneSecond
(从配置/计算/等中加载)而不是保持不变。这些更改不会改变抽象并影响使用您的Milliseconds
类的人。
它允许您通过替换DLL来更新您的值。如果你使用常量并替换包含你的Milliseconds
类的DLL,它就不会起作用,因为常量是内联的 - 你将不得不重建整个项目。
答案 1 :(得分:0)
在回应我收到的其中一条评论时,我现在已经对此进行了标记。我假设编译器能够内联并优化lambda表达式,所以在这种情况下,两者几乎是相同的,但事实证明我错了。
我的基准确认了Yeldar Kurmangaliyev的答案。使用lambda表达式代替常量都会增加它们所在的dll的大小和最终exe的大小,并且会对性能产生不利影响。对于调试和发布版本都是如此。
我的基准测试使用了4,500个常量或lambda表达式,从它们构造了一个数组,然后在数组上做了一些简单的数学运算,然后重复了这个过程十万次。
使用consts:
dll大小为94kb
exe大小为22kb
基准测试需要2秒钟。
使用lambdas:
dll大小为173kb
exe大小为115kb
benchamrk花了17秒。
两者的计时都提高了调试的运行释放(0.6秒和9.5秒)。你的数字可能会有所不同,我只是以我的为指导。
所以,我会坚持使用#gradle.properties
VERSION_CODE=328
VERSION_NAME=1.5.8
#module build.gradle
versionCode project.VERSION_CODE as int
versionName project.VERSION_NAME
作为常量。