斐波那契(Fibonacci)数列测试几种编程语言速度

本文通过在Ubuntu 10.10系统上测试不同编程语言(C、C++、Haskell、Lua、Python、Java)实现斐波那契数列第40项的时间,展示了各语言的运行效率。测试结果显示,从快到慢的顺序为:C、Haskell、C++、Lua、Python、Java。C语言表现最快,Haskell比动态语言快,而Java运行时间最长。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


CPU: Pentium Dual-Core 3.20GHz

RAM: 2.00GB

操作系统:Ubuntu 10.10

编译器/解释器
语言编译器/解释器版本
Cgcc 4.4.5
C++g++ 4.4.5
HaskellGHC - The Glorious Glasgow Haskell Compilation System
 6.12.1
Lua  
Python  2.6.6
Javagcj java version "1.5.0"
gij (GNU libgcj) version 4.4.5

测试结果如下:

 

Fibonacci of 40:
===================
C: 102334155

real    0m1.234s
user    0m1.232s
sys    0m0.000s
*******************
C++
C: 102334155

real    0m1.383s
user    0m1.380s
sys    0m0.000s
*******************
Haskell: 102334155

real    0m1.352s
user    0m1.348s
sys    0m0.000s
*******************
fib1
Haskell: 102334155

real    0m18.957s
user    0m18.937s
sys    0m0.016s
*******************
run haskell script
Haskell: 102334155

real    0m1.362s
user    0m1.344s
sys    0m0.012s
*******************
Lua: 102334155

real    0m18.367s
user    0m18.365s
sys    0m0.000s
*******************
Python: 102334155

real    0m37.623s
user    0m37.562s
sys    0m0.036s
*******************
pyc
Python: 102334155

real    0m37.930s
user    0m37.846s
sys    0m0.036s
*******************
Java: 102334155

real    1m18.012s
user    1m17.953s
sys    0m0.024s
*******************

可以明显看出来,速度由快到慢的顺序是:

C、Haskell、C++、Lua、Python、Java

得到以下结论:

  1. C最快
  2. Haskell比动态语言快
  3. 动态语言中,最快的是Lua
  4. Java排在最后,有点意外

测试源代码文件如下:

// C和C++的源程序

// file: fib.c

#include <stdio.h>
#include <stdlib.h>

long fib(int n)
{
    switch (n) {
    case 0:
        return 0;
    case 1:
        return 1;
    default:
        return fib(n-1)+fib(n-2);
    }
}

main(int argc, char *argv[])
{
    if (argc != 2)
        printf("Usage: fibc <number>/n");
    else
        printf("C: %ld/n", fib(atoi(argv[1])));
}

 


-- file: fib.hs

module Main where

import System.Environment (getArgs)

fib :: Int -> Int
fib 0 = 0
fib 1 = 1
fib n = fib (n-1) + fib (n-2)

main = do
  argv <- getArgs

  if length argv /= 1
    then
      putStrLn "Usage: fib <number>"
    else
      --print $ fib $ read $ head argv
      putStrLn ("Haskell: " ++ (show $ fib $ read $ head argv))

 


 


-- file: fib1.hs

 

 

module Main where

import System.Environment (getArgs)

fib 0 = 0
fib 1 = 1
fib n = fib (n-1) + fib (n-2)

main = do
  argv <- getArgs

  if length argv /= 1
    then
      putStrLn "Usage: fib <number>"
    else
      putStrLn ("Haskell: " ++ (show $ fib $ read $ head argv))

 


 


// file: fib.java

 

 

public class fib {
    public static long fib_(int n) {
        if (n <= 2)
            return 1;
        else
            return fib_(n-1)+fib_(n-2);
    }

    public static void main(String [] args) {
        if (args.length != 1) {
            System.out.println("Usage: java fib <number>");
        } else {
            int n = Integer.parseInt(args[0]);
            System.out.println("Java: " + fib_(n));
        }
    }
}

 


 


 

# file: fib.lua

function fib(n)
  if (n <= 2) then
    return 1
  else
    return fib(n-1)+fib(n-2)
  end
end

if (#arg ~= 1) then
  print("Usage: lua fib.lua <number>")
else
  print("Lua: " .. fib(tonumber(arg[1])))
end

 


 


 

# file: fib.py

import sys

def fib(n):
    if n <= 2:
        return 1
    else:
        return fib(n-1) + fib(n-2)

if len(sys.argv) != 2:
    print "Usage: python fib.py <number>"
else:
    print "Python: " + str(fib(int(sys.argv[1])))

 

 


 

Makefile

 

DEST=fibc fibcxx fib fib1 fib.class fib.pyc

all: $(DEST)

test: $(DEST)
  echo "./test.sh <number>"

fibc: fib.c
  $(CC) -o $@ $< -O2

fibcxx: fib.c
  $(CXX) -o $@ $< -O2
 
fib: fib.hs
  ghc -o $@ $< -O2
      
fib1: fib1.hs
  ghc -o $@ $<
      
fib.class: fib.java
  javac $<

fib.pyc: fib.py
  pycompile $<

clean:
  $(RM) $(DEST) *.o *.hi

 

 


 

#!/bin/bash

# file: speed.sh

echo Fibonacci of $1:
echo ===================

time ./fibc $1
echo /*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*

echo C++
time ./fibcxx $1
echo /*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*

time ./fib $1
echo /*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*

echo fib1
time ./fib1 $1
echo /*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*

echo run haskell script
time runhaskell fib.hs $1
echo /*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*

time lua fib.lua $1
echo /*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*

time python fib.py $1
echo /*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*

echo pyc
time python fib.pyc $1
echo /*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*

time java fib $1
echo /*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*

 

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值