面试题答案
一键面试1. measureTimeMillis
measureTimeMillis
是 Kotlin 标准库中的函数,用于测量代码块执行所花费的时间(以毫秒为单位)。通过测量执行时间,能帮助我们发现性能瓶颈。
示例:
fun frequentlyExecutedFunction() {
// 模拟一些计算
var sum = 0
for (i in 1..1000000) {
sum += i
}
}
fun main() {
val timeMillis = measureTimeMillis {
for (var i = 0; i < 100; i++) {
frequentlyExecutedFunction()
}
}
println("执行 100 次 frequentlyExecutedFunction 花费了 $timeMillis 毫秒")
}
2. @OptIn(ExperimentalUnsignedTypes::class)
配合无符号整数类型
在某些场景下,使用无符号整数类型(如 UInt
、ULong
)可以提升性能,因为它们在处理一些特定运算时更高效。不过需要注意,使用无符号整数类型需要添加 @OptIn(ExperimentalUnsignedTypes::class)
注解。
示例:
@OptIn(ExperimentalUnsignedTypes::class)
fun frequentlyExecutedFunctionWithUnsigned() {
var sum: UInt = 0u
for (i in 1u..1000000u) {
sum += i
}
}
fun main() {
val timeMillis = measureTimeMillis {
for (var i = 0; i < 100; i++) {
frequentlyExecutedFunctionWithUnsigned()
}
}
println("执行 100 次 frequentlyExecutedFunctionWithUnsigned 花费了 $timeMillis 毫秒")
}
3. 内联函数(inline
)
使用 inline
关键字标记函数,编译器会将函数调用替换为函数体代码,减少函数调用的开销,对于频繁执行的小函数性能提升明显。
示例:
inline fun calculateSum() {
var sum = 0
for (i in 1..1000000) {
sum += i
}
}
fun main() {
val timeMillis = measureTimeMillis {
for (var i = 0; i < 100; i++) {
calculateSum()
}
}
println("执行 100 次 calculateSum 花费了 $timeMillis 毫秒")
}
4. 懒加载(lazy
)
如果有一些对象或计算结果不是每次都需要,使用 lazy
可以延迟初始化,避免不必要的性能开销。
示例:
val expensiveValue: Int by lazy {
// 模拟一些耗时操作
var result = 0
for (i in 1..1000000) {
result += i
}
result
}
fun main() {
val timeMillisBefore = System.currentTimeMillis()
// 第一次访问 expensiveValue 会触发初始化
println("expensiveValue: ${expensiveValue}")
val timeMillisAfterFirst = System.currentTimeMillis()
// 后续访问不会再次初始化
println("expensiveValue: ${expensiveValue}")
val timeMillisAfterSecond = System.currentTimeMillis()
println("第一次访问花费 ${timeMillisAfterFirst - timeMillisBefore} 毫秒")
println("第二次访问花费 ${timeMillisAfterSecond - timeMillisAfterFirst} 毫秒")
}