译者序
本文虽然标题略有争议,但Bob大叔撰写此文并非是要说明Java>C/C++>Ruby,而是延续上篇“性能调优--永远超乎想象”的风格,借以说明程序的性能一般都超乎我们想象的观点,因此请读此文的C/C++爱好者少安毋躁:-)
正文
你可能会觉得下面的图表比较有意思,因为它是分别用三种编程语言(Ruby, Java, C/C++)写的埃拉托色尼质数过滤算法(译注:Sieve of Eratosthenes)的性能分析图,如图:(本文的最后附有相应代码)
好,很明显Ruby是慢的,而且慢了大概有1.5个数量级(译注:即约30倍)。这对于Ruby爱好者来说可不是个好消息。不过换个角度看,呼!Ruby与五、六年前的顶级电脑一样快。还记得第一次在时钟周期不到一兆赫的机器上跑程序的神奇情景吗...我们还为此兴奋得直往山顶跑!
注意一下,这三条曲线是同样形状的,我们可以从上篇blog中了解到为何曲线会呈线性。最后要关注的是,Java的曲线以极其微小的优势快于C++。你可以抱怨那是因为没有用gcc编译器优化编译的缘故(我用的是cygwin(译注:gcc编译器移植到windows的版本)),可是,如果现在还有任何C++程序员还会嘲笑Java的性能的话,我劝你最好还是再重新掂量掂量吧。
而对于那些因为他们自己的开发环境比Ruby快上30倍而洋洋自得的Java程序员来说,我肯定更优的ruby实时编译器即将问世了。不管如何,相比那快上1.5个数量级的情形来说,我本人还是更喜欢干净、简洁、易维护的代码。
Ruby
require 'benchmark'
def sievePerformance(n)
r = Benchmark.realtime() do
sieve = Array.new(n,true)
sieve[0..1] = [false,false]
2.upto(Integer(Math.sqrt(n)) do |i|
if sieve[i]
(2*i).step(n,i) do |j|
sieve[j] = false
end
end
end
end
r
end
Java
public class GeneratePrimes {
public static double generate(int max) {
long start = System.currentTimeMillis();
boolean sieve[] = new boolean[max];
Arrays.fill(sieve, true);
sieve[0] = false;
sieve[1] = false;
for (int i = 2; i < Math.sqrt(max); i++) {
if (sieve[i]) {
for (int j = 2*i; j < sieve.length; j+=i) {
sieve[j]= false;
}
}
}
return (System.currentTimeMillis() - start)/1000.0;
}
C++
#include <iostream>>
#include <math.h>
#include <sys/time.h>
using namespace std;
double generate(int max) {
struct timeval start;
struct timezone tz;
gettimeofday(&start, &tz);
bool *sieve = new bool[max];
for (int i=0; i<max; i++) sieve[i] = true;
sieve[0] = false;
sieve[1] = false;
for (int n=2; n<sqrt(max); n++) {
if (sieve[n]) {
for (int j=2*n; j<max; j+=n)
sieve[j] = false;
}
}
struct timeval end;
gettimeofday(&end, &tz);
double startSecond = start.tv_usec/1000000.0;
double endSecond = (end.tv_sec - start.tv_sec) + end.tv_usec/1000000.0;
return endSecond - startSecond;
}
int main(int ac, char** av) {
for (int i=100000; i<=5000000; i+=100000) {
double time = generate(i);
cout << time << endl;
}
}
(原文链接网址:http://www.butunclebob.com/ArticleS.UncleBob.SpeedOfJavaCppRuby; Robert C. Martin的英文blog网址:http://www.butunclebob.com/ArticleS.UncleBob)
作者简介:Robert C. Martin是Object Mentor公司总裁,面向对象设计、模式、UML、敏捷方法学和极限编程领域内的资深顾问。他不仅是Jolt获奖图书《敏捷软件开发:原则、模式与实践》(中文版)(《敏捷软件开发》(英文影印版))的作者,还是畅销书Designing Object-Oriented C++ Applications Using the Booch Method的作者。Martin是Pattern Languages of Program Design 3和More C++ Gems的主编,并与James Newkirk合著了XP in Practice。他是国际程序员大会上著名的发言人,并在C++ Report杂志担任过4年的编辑。
分享到:
相关推荐
嵌入式系统的微模块化程序设计---实用状态图C/C++实现是:嵌入式系统,实时系统及UML状态图设计的理想参考书。
资源是笔者在MATLAB里面安装的MinGW-w64 C/C++编译器安装包,主要用于作为博文https://blog.csdn.net/jiqiren_dasheng/article/details/103759720的资源附件。(声明:上传时积分设置的1,如果数值后续变了,就是...
C#深入浅出全接触 .rar http://down.qiannao.com/space/file/yuexingchen2/-4e0a-4f20-5206-4eab/C-002b-002b-0020-0020-00b7C-0020-0020vc/C-0023-6df1-5165-6d45-51fa-5168-63a5-89e6-0020.rar/.page C#知识类库 ....
C/C++语言编程安全子集
软件---用于C/C++编程,方便!。。。。。。。。。。。。
C#深入浅出全接触 .rar http://down.qiannao.com/space/file/yuexingchen2/-4e0a-4f20-5206-4eab/C-002b-002b-0020-0020-00b7C-0020-0020vc/C-0023-6df1-5165-6d45-51fa-5168-63a5-89e6-0020.rar/.page C#知识类库 ....
android NDK入门篇----混合使用java和c/c++代码 源码工程 包括头文件 源文件以及生成的so库
压缩包内附:软件安装包,安装教程和环境变量配置教程 解决问题: 输入mex -setup时提示如下: 错误使用 mex 未找到支持的编译器或 SDK。你可以安装免费提供的MinGW-w64C/C++编译器;有关更多选项,请访问 ...
附件资源下载源位置 https://ww2.mathworks.cn/matlabcentral/fileexchange/52848-matlab-support-for-mingw-w64-c-c-compiler,按照官网介绍,仅适用于...未找到支持的编译器或SDK,MinGW-w64 C/C++编译器在线安装
基于VS2019 C/C++、DLT645-2007 dll库和1997的dll库的控制台demo程序,demo比较简单,但两个dll很强大,实现了各类规约的接口,起初是针对linux平台的我改成windows端vs了
Dev-cpp5.4.0及API帮助文档 2018年蓝桥杯C语言/c++ 需要的同学可以下载使用
Matlab安装 MinGW-w64 编译器。 包括下载好的MinGW-w64 C/C++和 简单的安装步骤(Readme.doc)
高质量程序设计指南--C++/C语言(第3版)]-[林锐.pdf
有关状态机设计方面的书籍,我这里隆重推荐一本:《Practical Statecharts in C/C++ Quantum Programming for Embedded Systems》,中文名叫做《嵌入式系统的微模块化程序设计-实用状态图C/C++实现》,北航出版的,...
对大家程序设计学习来说是很好的参考书,收益匪浅,推荐大家学习
c++爱好者 必看
在C/C++与汇编语言混合编程的情况下,一般我们都会选择C/C++来实现所期待的大部分功能,对于少数和硬件关联度高(例如操作某些CPU寄存器)以及对运算的实时性要求高(例如高速、多点的FFT)的功能才使用汇编来实现,这就...
最近需要和银行pos做数据通讯,银行端算法为java实现的 AES/ECB/PKCS5PADDING我也改不了, c/c++这边实现ECB算法本来就少,PKCS5PADDING的更是没有,索性自己动手。工作原因c和java都得熟悉,因此把java端和c/c++...
GB/T 34943-2017 C/C++语言源代码漏洞测试规范,主要讲述了源代码漏洞的测试总则、测试内容、漏洞分类、漏洞说明,以及相应的漏洞测试案例。
本压缩包文件集锦了嵌入式C/C++开发编程技巧,高效编程技术探索,C/C++语言相关技术问题的深层探索,并且对嵌入式C/C++程序员应聘常见面试题进行了深入剖析,对嵌入式C/C++开发者编程修炼,提升自身的相关能力具有很...