分配更多变量如何影响应用的性能?

How does assigning more variables affect performance of an app?

提问人:GrandPC 提问时间:9/12/2022 最后编辑:GrandPC 更新时间:9/12/2022 访问量:69

问:

我会说比 更具可读性,这在我看来非常重要,但需要分配一个新变量。这对应用性能和内存使用率有何影响?使用起来在技术上更有效率吗,这是否相同?也许在编译应用程序时会进行一些优化?我主要询问 Android 应用程序,但也对它在其他平台、系统或编程语言中的工作方式感兴趣。谢谢。println(sum)println(var1.roundToInt() + var2.roundToInt())println(var1.roundToInt() + var2.roundToInt())

import kotlin.math.roundToInt

fun main() {
    val var1 = 1.0 + 3.3
    val var2 = 5.8 - 1.99
    val sum = var1.roundToInt() + var2.roundToInt()
    println(var1.roundToInt() + var2.roundToInt())
    println(sum)
}
Android Kotlin 变量

评论

2赞 cutiko 9/12/2022
按两次shift键,写出“byte code”,然后在新的编辑器中点击“Decompile”,就可以自己看到Java版本

答:

3赞 Gabe Sechan 9/12/2022 #1

在这种情况下,您实际上不太可能存储更多变量 - 在初始编译器和 JVM 的 JIT 编译之间,它可能会被优化掉,因此不会有任何区别。

忽略这一点,假设它实际上确实将其存储在多个变量中。写入寄存器只需几分之一纳秒。像在 println 中那样写入日志将需要几微秒的时间。您正在优化最终无关紧要的部分。不要担心这个级别的优化,除非你真的知道你需要(提示:你几乎从来不需要,如果你这样做,你几乎肯定应该用 C 而不是 kotlin/Java 编写)。

评论

0赞 cactustictacs 9/12/2022
有人认为你应该避免在 Android 中不必要地创建对象(这个例子只是基元,所以它不适用)——他们有一整套关于性能优化的系列,鼓励这种方法,所以这可能就是人们担心它的原因。根据您正在执行的操作,有时这很重要 - 如果您以 60fps(或某些设备上为 90 或 120fps)更新自定义视图,分配可能会很快开始增加。如果您想避免低端设备上出现过多的 GC 或内存压力,值得考虑。不过不是为了一个额外的对象!
0赞 Gabe Sechan 9/12/2022
@cactustictacs IT 无论如何都不适用 - 分配变量不是创建对象。创建需要调用 new(在 kotlin 中,调用构造函数)。有些地方需要避免这种情况,因为内存分配速度很慢。但如果这是他要问的,他需要问得更好——这是一个完全不同的问题,这是关于分配变量的。
0赞 cactustictacs 9/12/2022
是的,这就是为什么我说它在这里不适用,因为它只是基元,但我把这个问题理解为“我应该避免创建变量吗?”——就像你说的,一般来说这并不重要,但在某些情况下你可能会关心它,而 Android 过去确实(确实?)推动了这个想法。所以我只是想添加一点背景。但大多数时候,当人们问它时,这真的无关紧要 - 看看 Android 框架产生的分配数量,只是正常地滴答作响。30,000 个额外的 int(甚至一个对象)或其他任何东西都不用担心!
1赞 Gabe Sechan 9/12/2022
这不仅仅是关于基元。如果它是一个对象,但你没有创建一个新对象,只是分配给变量,它也不会调用内存分配,因此会快如闪电。分配引用根本不需要时间。val x=getFoo(),其中 Foo 是一个对象,如果 Foo 没有被创建,则花费的时间不到一纳秒。创建对象需要时间,尤其是当它导致创建其他子对象时。但这个问题是关于分配的,而不是关于创造的。
0赞 cactustictacs 9/13/2022
哦,对不起,我明白你的意思了,是的 - 也许他们只是在询问他们已经在运行的表达式的中间变量。我只是想提一下分配方面,因为它更重要、更相关,而且就官方 Android 最佳实践而言,这种担忧听起来很熟悉。以防万一这是他们要求的部分原因