| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 568 人关注过本帖, 1 人收藏
标题:编程语言分形算法大乱斗(可能违反本版版规 如果这样麻烦几位版主帮忙转到水 ...
只看楼主 加入收藏
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
结帖率:100%
收藏(1)
 问题点数:0 回复次数:5 
编程语言分形算法大乱斗(可能违反本版版规 如果这样麻烦几位版主帮忙转到水区去 谢谢了)
编程语言分形算法大乱斗(可能违反本版版规 如果这样麻烦几位版主帮忙转到水区去 谢谢了)

;*****************************************************************************************************************
;作者:zklhp  
;Email:zklhp@
;QQ:493165744
;版权所有    转载请保持完整
;*****************************************************************************************************************

本贴无意比较语言优劣 所得结果不足以判断语言效率 只不过是我的一个消遣和娱乐 如有不妥欢迎批评指正

这帖放哪都不好 C区人多放这好了 也有C语言 只不过只占一部分

这个测试是根据

http://www.

这个写的 貌似作者更新了 我用我能找到的编译器重现了一下 基于原文的代码

gcc 4.4.5 (QP MinGW32) 参数 gcc.exe -Wall -O2

程序代码:

#include <stdio.h>
#include <time.h>

#define BAILOUT 16
#define MAX_ITERATIONS 1000

int mandelbrot(double x, double y)
{
    double cr = y - 0.5;
    double ci = x;
    double zi = 0.0;
    double zr = 0.0;
    int i = 0;

    while(1) {
        i ++;
        double temp = zr * zi;
        double zr2 = zr * zr;
        double zi2 = zi * zi;
        zr = zr2 - zi2 + cr;
        zi = temp + temp + ci;
        if (zi2 + zr2 > BAILOUT)
            return i;
        if (i > MAX_ITERATIONS)
            return 0;
    }

}


int main()
{
    long t1 = 0, t2 = 0;
    t1 = clock();

    int x,y;
    for (y = -39; y < 39; y++) {
        printf("\n");
        for (x = -39; x < 39; x++) {
            int i = mandelbrot(x/40.0, y/40.0);
            if (i==0)
                printf("*");
            else
                printf(" ");

        }
    }
    printf ("\n");

    t2 = clock();
    double query_time = (t2 - t1)/1000.0;
    printf ("C Elapsed %0.2f\n", query_time);
    return 0;
}


C Elapsed 0.20



VC 2008 我调的编译参数是 /Ox /Ob2 /Oi /Ot
程序代码:

#include "stdafx.h"    //预编译头包含用到的头文件

#define BAILOUT 16
#define MAX_ITERATIONS 1000

int mandelbrot(double x, double y)
{
    double cr = y - 0.5;
    double ci = x;
    double zi = 0.0;
    double zr = 0.0;
    int i = 0;

    while(1) {
        i ++;
        double temp = zr * zi;
        double zr2 = zr * zr;
        double zi2 = zi * zi;
        zr = zr2 - zi2 + cr;
        zi = temp + temp + ci;
        if (zi2 + zr2 > BAILOUT)
            return i;
        if (i > MAX_ITERATIONS)
            return 0;
    }

}


int _tmain(int argc, _TCHAR* argv[])
{
    long t1 = 0, t2 = 0;
    t1 = clock();

    int x,y;
    for (y = -39; y < 39; y++) {
        printf("\n");
        for (x = -39; x < 39; x++) {
            int i = mandelbrot(x/40.0, y/40.0);
            if (i==0)
                printf("*");
            else
                printf(" ");
           
        }   
    }
    printf ("\n");

    t2 = clock();
    double query_time = (t2 - t1)/1000.0;   
    printf ("C Elapsed %0.2f\n", query_time);
    return 0;
}



Elapsed 0.27


python  2.6.6 都是默认参数
程序代码:

import sys, time
stdout = sys.stdout

BAILOUT = 16
MAX_ITERATIONS = 1000

class Iterator:
  def __init__(self):
    print 'Rendering...'
    for y in range(-39, 39):
      stdout.write('\n')
      for x in range(-39, 39):
        i = self.mandelbrot(x/40.0, y/40.0)
       
        if i == 0:
          stdout.write('*')
        else:
          stdout.write(' ')
   
  def mandelbrot(self, x, y):
    cr = y - 0.5
    ci = x
    zi = 0.0
    zr = 0.0
    i = 0

    while True:
      i += 1
      temp = zr * zi
      zr2 = zr * zr
      zi2 = zi * zi
      zr = zr2 - zi2 + cr
      zi = temp + temp + ci
          
      if zi2 + zr2 > BAILOUT:
        return i
      if i > MAX_ITERATIONS:
        return 0

t = time.time()
Iterator()
print '\nPython Elapsed %.02f' % (time.time() - t)


编译版 Elapsed  1.84
解释版 Elapsed  1.88


javascript 这个和解释器有关系了 我用的是firefox的引擎 也就是SpiderMonkey ftp上面下载的最新测试版 Version: JavaScript-C 1.8.5+ 2011-04-16

程序代码:

function mandelbrot(x, y) {
    var cr = y - 0.5;
    var ci = x;
    var zi = 0.0;
    var zr = 0.0;
    var i = 0;
    var BAILOUT = 16;
    var MAX_ITERATIONS = 1000;

    while(1) {
        i++;
        var temp = zr * zi;
        var zr2 = zr * zr;
        var zi2 = zi * zi;
        zr = zr2 - zi2 + cr;
        zi = temp + temp + ci;
        if (zi2 + zr2 > BAILOUT) {
            return i;
        }
        if (i > MAX_ITERATIONS) {
            return 0;
        }
    }
}

function mandelbrot_run() {
    var x; var y;
    output = "";
   
    var date = new Date();
    for (y = -39; y < 39; y++) {
        print(output);
        output = "";
        for (x = -39; x < 39; x++) {
            var i = mandelbrot(x/40.0, y/40.0);
            if (i==0) {
                output += "*";
            }
            else {
                output += " ";
            }
        }   
    }
    var date2 = new Date();
    output += "\nJavaScript Elapsed " + (date2.getTime() - date.getTime()) / 1000;
    print(output);
    return false;
}

mandelbrot_run();


Elapsed 1.647


Emacs lisp 也就是elisp 其实我是查这个的时候偶然找到上面的东东的 这个是正题 因为我想知道到底这玩意效率咋样
GNU Emacs 24.0.95.1 也是测试版 默认参数

程序代码:

(defun iterate (xx yy)

  (let*
      (
       (BAILOUT 16.0)
       (MAX_ITERATIONS 1000)
       (bail_val 0)
       (cr (- yy 0.5))
       (ci xx)
       (zi 0.0)
       (zr 0.0)
       (i 0)
       )
    (while (and (< i MAX_ITERATIONS) (< bail_val BAILOUT))
      (setq i (+ 1 i))
      (setq temp (* zr zi))
      (setq zr2 (* zr zr))
      (setq zi2 (* zi zi))
      (setq zr (+ (- zr2 zi2) cr))
      (setq zi (+ temp temp ci))
     
      (setq bail_val (+ zi2 zr2)))
    i)
  )

(defun mandelbrot()
  (setq yy -39)
  (while (< yy 39)

    (setq yy (+ 1 yy))

    (setq xx -39)
    (while (< xx 39)
      (setq xx (+ 1 xx))
     
      (if (= (iterate (/ xx 40.0) (/ yy 40.0)) 1000)
      (princ  "*")
    (princ  " ")
    )
      )
    (princ  "\n")
    ))
(setq the-time (cadr (current-time)))
(mandelbrot)
(princ (format "Elapsed %d" (- (cadr (current-time)) the-time)))



解释版 Elapsed 12
编译版 Elapsed 7或8

不知道怎么得到毫秒。。


讨论

1 加了优化参数的VC不如gcc效率高。。 和我一直的认识不一致

2 python效率确实挺好 看着有点像玩具其实很强大

3 javascript引擎由于经历了历次浏览器战争而得到了很好的优化 如果用chrome的V8引擎或许速度更快 可惜没有像jsshell这样现成的东西

4 elisp效率挺好的 编译能提高性能 大约50%哦

[ 本帖最后由 zklhp 于 2012-4-9 19:31 编辑 ]
搜索更多相关主题的帖子: 编程语言 算法 Email 
2012-04-09 19:28
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
                                      *
                                      *
                                      *
                                      *
                                     ***
                                    *****
                                    *****
                                     ***
                                      *
                                  *********
                                *************
                               ***************
                            *********************
                            *********************
                             *******************
                             *******************
                             *******************
                             *******************
                           ***********************
                             *******************
                             *******************
                            *********************
                             *******************
                             *******************
                              *****************
                               ***************
                                *************
                                  *********
                                      *
                               ***************
                           ***********************
                        * ************************* *
                        *****************************
                     * ******************************* *
                      *********************************
                     ***********************************
                   ***************************************
              *** ***************************************** ***
              *************************************************
               ***********************************************
                *********************************************
                *********************************************
               ***********************************************
               ***********************************************
             ***************************************************
              *************************************************
              *************************************************
             ***************************************************
             ***************************************************
        *    ***************************************************    *
      *****  ***************************************************  *****
      ****** *************************************************** ******
     ******* *************************************************** *******
   ***********************************************************************
   ********* *************************************************** *********
      ****** *************************************************** ******
      *****  ***************************************************  *****
             ***************************************************
             ***************************************************
             ***************************************************
             ***************************************************
              *************************************************
              *************************************************
             ***************************************************
               ***********************************************
               ***********************************************
                 *******************************************
                  *****************************************
                *********************************************
               **** ****************** ****************** ****
                ***  ****************   ****************  ***
                 *    **************     **************    *
                        ***********       ***********
                        **  *****           *****  **
                         *   *                 *   *

效果如图 顺便自己顶

2012-04-09 19:29
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
大乌龟 也能这么画 牛啊牛啊

梅尚程荀
马谭杨奚







                                                       
2012-04-09 19:55
小赵q1
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:4
帖 子:492
专家分:777
注 册:2011-8-26
收藏
得分:0 
两边是对称的东西
2012-04-10 00:16
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:0 
发现个老帖子,不过还挺好玩。

把 elisp 的最后几行改成:
程序代码:
(setq the-time (cdr (current-time)))
(mandelbrot)
(setq end-time (cdr (current-time)))
(setq the-time (+ (car the-time)
          (/ (cadr the-time) 1000000.0)))
(setq end-time (+ (car end-time)
          (/ (cadr end-time) 1000000.0)))
(princ (format "Elapsed %d" (- end start)))
就可以测毫秒。(我是 GNU Emacs 23.3.1。虽然手册说 (current-time) 返回的是毫秒,但实际我这返回的好像是纳秒。如果感觉结果不太对的话,把那两个一百万改成 1000.0 就行了。)

在我这不编译直接跑也就是用 3.77 秒左右(编译完了是 1.89 秒)。而那个 C 语言版的运行结果是 0.02...
看来和 z 版的笔记本比,我的台式机就是神机呀。elisp 能有这种效率,我很意外。


[ 本帖最后由 pangding 于 2012-7-29 22:02 编辑 ]
2012-07-29 02:00
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:0 
我又写了一个 vim-script 的脚本:
程序代码:
let s:BAILOUT = 16.0
let s:MAX_ITERATIONS = 1000

function! Mandelbrot (x, y)
    let cr = a:y - 0.5
    let ci = a:x
    let zi = 0.0
    let zr = 0.0
    let i = 0

    while 1
        let i += 1
        let temp = zr * zi
        let zr2 = zr * zr
        let zi2 = zi * zi
        let zr = zr2 - zi2 + cr
        let zi = temp + temp + ci
        if zi2 + zr2 > s:BAILOUT
            return i
        endif
        if i > s:MAX_ITERATIONS
            return 0
        endif
    endwhile
endfunction

let str = ""
let start = reltime()

for y in range(-39, 38)
    let str .= "\n"
    for x in range(-39, 38)
        let i = Mandelbrot(x/40.0, y/40.0)
        if i == 0
            let str .= "*"
        else
            let str .= " "
        endif
    endfor
endfor

echo "Vim-script: Elapsed" . reltimestr(reltime(start))
call setreg('r', str)
它把那个图形存在寄存器 "r 里面,以方便之后使用。在我的机子上大约要跑 29 秒。

看来以为编辑器脚本的数值运算能力不行的印象是来自 vim,vim-script 的执行速度是不能和 elisp 同日而语的。
这个结果倒是意料之中,不过 elisp 那么快真是没想到。
2012-07-29 14:06
快速回复:编程语言分形算法大乱斗(可能违反本版版规 如果这样麻烦几位版主帮忙转 ...
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.038500 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved