BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / acm-icpc / #88006同步于 2015/10/14
该镜像源已超过 30 天没有更新,可能在源站已被删除。
ACM_ICPC机器人发帖

C++:10ms java:1100+ms

shixu
2015/10/14镜像同步17 回复
本小白刚刚开始刷题 感觉leetcode太难(众神勿喷 已注明本人小白一枚) 就从lintcode刷起。写了几道简单的 然后我比较了Java和c++的运行时间,尼玛同样的代码啊,c++都是10ms左右,尼玛Java动辄1000+ms,这可是100多倍的差距啊。。虽然知道Java速度不如c++快 但是看到这个结果,瞬间感觉Java哔了狗了。。
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
nuanyangyang机器人#1 · 2015/10/14
不是你的错。 和leetcode那边如何运行Java和C++的程序有关。Java的初始化代价比较大,所以,如果服务器那边朴素地对每个测试用例都重新启动一个JVM,那么肯定慢。 也和数据结构的选取有关。比如对于基本类型,ArrayList会引起大量的装箱拆箱操作,代价很大;但用普通数组就没事。但如果题目给你的就是ArrayList这样的肥硕的容器,而C++收到的是裸露的简单数组,那就显然对Java不利了。 Java是难得的有高效虚拟机实现(hotspot jvm)的有垃圾回收的语言。通常Java和C++之间的差距在1-2倍之间,有些情况下Java反而快。 另外,如果有具体的题目,可以贴出来。我倒是比较好奇这样的题目是什么样的。如果能贴那个具体的相差100倍的C++和Java程序那就更好了。
fuxuemingzhu机器人#2 · 2015/10/15
OJ的程序运行时好像不是每个测试用例都单开一个 JVM。 因为我发现我程序中的 static 变量 在同一个题目的测试时是不变的。 【 在 nuanyangyang (暖羊羊) 的大作中提到: 】 : 不是你的错。 : 和leetcode那边如何运行Java和C++的程序有关。Java的初始化代价比较大,所以,如果服务器那边朴素地对每个测试用例都重新启动一个JVM,那么肯定慢。 : ...................
fuxuemingzhu机器人#3 · 2015/10/15
我说的是 LeetCode。其他的OJ就不知道了。 【 在 nuanyangyang (暖羊羊) 的大作中提到: 】 : 不是你的错。 : 和leetcode那边如何运行Java和C++的程序有关。Java的初始化代价比较大,所以,如果服务器那边朴素地对每个测试用例都重新启动一个JVM,那么肯定慢。 : ...................
inaadversity机器人#4 · 2015/10/15
只需要提供solution类这样的oj,完全可以启动一次jvm搞定啊
hh1562535601机器人#5 · 2015/10/15
lintcode比leetcode简单?那我这种菜鸡也去试试吧[ema1] Java现在和C++的性能差距只有1-2倍了啊,C++慢了,Java快了,差距在缩小,看来Java确实该流行。 leetcode上同样的题,C毫无疑问是运行速度最快的,每次看统计数据基本都(遥遥)领先,相反Java一直垫底,不要说C/C++,python、javascript都比不过。。
shixu机器人#6 · 2015/10/15
【 在 nuanyangyang 的大作中提到: 】 : 不是你的错。 : 和leetcode那边如何运行Java和C++的程序有关。Java的初始化代价比较大,所以,如果服务器那边朴素地对每个测试用例都重新启动一个JVM,那么肯定慢。 : 也和数据结构的选取有关。比如对于基本类型,ArrayList会引起大量的装箱拆箱操作,代价很大;但用普通数组就没事。但如果题目给你的就是ArrayList这样的肥硕的容器,而C++收到的是裸露的简单数组,那就显然对Java不利了。 : ................... 运行了好几个程序 Java都是1000+ 而c++基本都是10左右。本来截了图 结果不知道怎么上传图片。。。但个人觉得不会每次提交代码都要服务器重新启动一个jvm吧 这样会不会开销太大了,服务器能受得了嚒
shixu机器人#7 · 2015/10/15
【 在 hh1562535601 的大作中提到: 】 : lintcode比leetcode简单?那我这种菜鸡也去试试吧 : Java现在和C++的性能差距只有1-2倍了啊,C++慢了,Java快了,差距在缩小,看来Java确实该流行。 : leetcode上同样的题,C毫无疑问是运行速度最快的,每次看统计数据基本都(遥遥)领先,相反Java一直垫底,不要说C/C++,python、javascript都比不过。。 我觉得lintcode比了leetcode稍微简单了一点吧。可能是因为lintcode是中文,而leet上面还要理解半天。。。英语渣渣
june0334机器人#8 · 2015/10/15
让我这不敢碰李特口德的渣渣怎么办
nuanyangyang机器人#9 · 2015/10/15
【 在 hh1562535601 的大作中提到: 】 : lintcode比leetcode简单?那我这种菜鸡也去试试吧 : Java现在和C++的性能差距只有1-2倍了啊,C++慢了,Java快了,差距在缩小,看来Java确实该流行。 我倒是不觉得C++慢了,起码GCC和clang上,C++和C用的是同一个后端。 : leetcode上同样的题,C毫无疑问是运行速度最快的,每次看统计数据基本都(遥遥)领先,相反Java一直垫底,不要说C/C++,python、javascript都比不过。。 看看benchmarkgame: http://benchmarksgame.alioth.debian.org/ 这个主页似乎坏了。 本来是用各种语言实现简单的算法。C和C++几乎一直领先,有时候超过第二位2-3倍。但那些计算密集型的任务中,C/C++都利用了多线程、OpenMP,甚至处理器相关的SIMD指令,这些严格地说不是C/C++自身的特性。而另外一些没有使用多线程和SIMD的C/C++程序和Java之类的在同一个数量级。 至于JavaScript,这个benchmarksgame中用的是V8实现,这是个高性能的js虚拟机,有jit编译,对于计算密集型的程序,经过疯狂的优化,代码质量和C/C++/Java在同一个数量级。如果是SpiderMonkey的话,也许比V8还要疯狂(这几年全世界第一个JS引擎SpiderMonkey开始发飙了)。leetcode使用的是nodejs,也是基于v8的,所以性能比Python甚至有时候比Java好也并不奇怪。 如果Java一直垫底,我真的怀疑他们是如何测量程序运行的时间的了。比如这里有benchmarksgame的测量方法。这种测量方法对Java很不利(他们真的每次启动一个jvm,但程序运行足够长,但Java的初始化还是一个弱点)即使这样,Java也并没有那么糟糕,一般是Python/Perl/PHP垫底。 http://benchmarksgame.alioth.debian.org/how-programs-are-measured.html 按leetcode FAQ的说法,测试Java程序的时候用的是同一个程序实例。但是因为输入输出不由参赛选手控制,我也不知道他们后端是如何读取测试数据的。如果服务器不幸使用了Scanner,那么……愿主保佑你。 还有,不知道leetcode对于不同的编程语言,测试用例的大小一样不一样,或许会因为本来就知道Python慢,故意不给它输入大规模的数据,所以看到的Python结果都是小测试用例的结果,不足以比较。