对于数组列表,哪个更有效:collections.swap() 或使用临时变量进行交换?
Which is more efficient for array lists: collections.swap() or using a temporary variable to swap?
int temp = name.get(0);
name.set(0, name.get(1));
name.set(1, temp)
Collections.swap(name, 0, 1)
我想交换两个元素,不知道哪个更有效率。两个交换的运行时间似乎相同,但我不太确定。谢谢!
Collections.swap
是:
public static void swap(List<?> list, int i, int j) {
// instead of using a raw type here, it's possible to capture
// the wildcard but it will require a call to a supplementary
// private method
final List l = list;
l.set(i, l.set(j, l.get(i)));
}
所以 2 get
s 和 2 set
s 对比 1 get
和 2 set
s。 Collections.swap
也很好地使用了 set
中的 return 值来绕过临时变量的使用。
I want to swap two elements and don't know which is more efficient. It seems like the runtime of both swaps are the same but I'm not too sure.
唯一可以确定的方法是编写正确的 micro-benchmark、运行 它(在许多硬件平台/Java 版本上)并解释结果。
我们可以查看源代码,并做出一些有根据的猜测,但我们无法从第一性原理micro-level推断出效率1.
我的建议:
- 按照您认为最易读的方式编写代码,让编译器进行优化。他们通常可以比大多数程序员做得更好。
- 如果您担心应用程序的性能,请编写应用程序基准测试并使用分析器找出真正 性能热点所在的位置。
- 使用热点信息来决定 值得 在 hand-tuning 应用程序中花费精力...而不是您的直觉/猜测。
1 - ...除非这里有人对现实世界 Java JIT 的知识不健康地详细编译器实际上可以跨多个平台工作。如果这里有这样的人,我们应该让他们安静地休息,而不是用这样的问题来打扰他们:-)
int temp = name.get(0);
name.set(0, name.get(1));
name.set(1, temp)
Collections.swap(name, 0, 1)
我想交换两个元素,不知道哪个更有效率。两个交换的运行时间似乎相同,但我不太确定。谢谢!
Collections.swap
是:
public static void swap(List<?> list, int i, int j) {
// instead of using a raw type here, it's possible to capture
// the wildcard but it will require a call to a supplementary
// private method
final List l = list;
l.set(i, l.set(j, l.get(i)));
}
所以 2 get
s 和 2 set
s 对比 1 get
和 2 set
s。 Collections.swap
也很好地使用了 set
中的 return 值来绕过临时变量的使用。
I want to swap two elements and don't know which is more efficient. It seems like the runtime of both swaps are the same but I'm not too sure.
唯一可以确定的方法是编写正确的 micro-benchmark、运行 它(在许多硬件平台/Java 版本上)并解释结果。
我们可以查看源代码,并做出一些有根据的猜测,但我们无法从第一性原理micro-level推断出效率1.
我的建议:
- 按照您认为最易读的方式编写代码,让编译器进行优化。他们通常可以比大多数程序员做得更好。
- 如果您担心应用程序的性能,请编写应用程序基准测试并使用分析器找出真正 性能热点所在的位置。
- 使用热点信息来决定 值得 在 hand-tuning 应用程序中花费精力...而不是您的直觉/猜测。
1 - ...除非这里有人对现实世界 Java JIT 的知识不健康地详细编译器实际上可以跨多个平台工作。如果这里有这样的人,我们应该让他们安静地休息,而不是用这样的问题来打扰他们:-)