BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / java / #26936同步于 2013/9/19
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖

[黑Java系列]Java也惊喜:数组

nuanyangyang
2013/9/19镜像同步18 回复
为什么下面第一个程序的速度和后面两个相差这么多,但瓶颈似乎并不在动态的泛型容器上。 package cn.byr.nuanyangyang.container; public class SimpleArray { public static void main(String[] args) { final int sz = 10000000; final int rep = 5; int lst[] = new int[sz]; for (int i = 0; i < sz; i++) { lst[i]=i; } long start = System.currentTimeMillis(); for (int j = 0; j < rep; j++) { for (int i = 0; i < sz; i++) { lst[i]=i; } } long stop = System.currentTimeMillis(); System.out.println(stop - start); // 48 } } package cn.byr.nuanyangyang.container; public class BoxedArray { public static void main(String[] args) { final int sz = 10000000; final int rep = 5; Integer lst[] = new Integer[sz]; for (int i = 0; i < sz; i++) { lst[i]=i; } long start = System.currentTimeMillis(); for (int j = 0; j < rep; j++) { for (int i = 0; i < sz; i++) { lst[i]=i; } } long stop = System.currentTimeMillis(); System.out.println(stop - start); // 6438 } } package cn.byr.nuanyangyang.container; import java.util.ArrayList; import java.util.List; public class GenericContainer { public static void main(String[] args) { final int sz = 10000000; final int rep = 5; List<Integer> lst = new ArrayList<Integer>(sz); for (int i = 0; i < sz; i++) { lst.add(i); } long start = System.currentTimeMillis(); for (int j = 0; j < rep; j++) { for (int i = 0; i < sz; i++) { lst.set(i, i); } } long stop = System.currentTimeMillis(); System.out.println(stop - start); // 6518 } }
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
bixiaopeng机器人#1 · 2013/9/19
感觉上是因为自动装箱,吧。。。
nuanyangyang机器人#2 · 2013/9/20
另外,下面这个Python程序,为什么用PyPy比Java还快?Python不是每个整数都是对象,就像Integer一样的吗? 换了一台机器,数据如下: SimpleArray: 42 (0.042秒) BoxedArray: 11213 (11.213秒) PyPy: 0:00:00.305129 #!/usr/bin/env pypy import datetime sz = 10000000 rep = 5 lst = range(sz) time1 = datetime.datetime.now() for j in xrange(rep): for i in xrange(sz): lst[i] = i time2 = datetime.datetime.now() print time2-time1 【 在 nuanyangyang 的大作中提到: 】 : 为什么下面第一个程序的速度和后面两个相差这么多,但瓶颈似乎并不在动态的泛型容器上。 : [code=java] : package cn.byr.nuanyangyang.container; : ...................
nuanyangyang机器人#3 · 2013/9/20
【 在 bixiaopeng 的大作中提到: 】 : 感觉上是因为自动装箱,吧。。。 是这个原因
bixiaopeng机器人#4 · 2013/9/20
【 在 nuanyangyang 的大作中提到: 】 : 另外,下面这个Python程序,为什么用PyPy比Java还快?Python不是每个整数都是对象,就像Integer一样的吗? : 换了一台机器,数据如下: : SimpleArray: 42 (0.042秒) : ................... 猜是因为被缓存的整数对象比java范围大,或者有什么特殊的整数对象的缓存机制,,,所以解释器基本没有malloc?
nuanyangyang机器人#5 · 2013/9/20
【 在 bixiaopeng 的大作中提到: 】 : 猜是因为被缓存的整数对象比java范围大,或者有什么特殊的整数对象的缓存机制,,,所以解释器基本没有malloc? 继续猜。找找论文也行。
jhaohai机器人#6 · 2013/9/20
integer是一个对象,好吧,想不出别的了
bixiaopeng机器人#7 · 2013/9/20
【 在 nuanyangyang 的大作中提到: 】 : : 继续猜。找找论文也行。 因为不懂python啊,,我先请问下,pypy是某种python解释器的实现么?和我系统里面那个不一样的解释器。如果是这样,那快是因为pypy吗?。。。不然我也不知道该搜python的性质还是pypy在这样的场景做优化了。。。
nuanyangyang机器人#8 · 2013/9/20
【 在 bixiaopeng 的大作中提到: 】 : 因为不懂python啊,,我先请问下,pypy是某种python解释器的实现么? 是的。Python是一个语言,而它的解释器有多个。最流行的是官方的解释器,俗称“CPython”因为是用C语言写的。PyPy是另一个Python解释器,本身也是用Python语言写的。 : 和我系统里面那个不一样的解释器。如果是这样,那快是因为pypy吗? 是的。PyPy对Python做了深层的优化。一个关键词是“Specialisation”,还有“Tracing Just-in-time Compiling”。这种优化对于动态语言很有用。 : 。。。不然我也不知道该搜python的性质还是pypy在这样的场景做优化了。。。 如果感兴趣的话,就看看Python语言是什么吧。顺便去pypy.org转转。
wencst机器人#9 · 2013/9/20
是因为对象的执行和基本类型的执行时所用的解释器不一样?