标题:大家帮看看,怎么回事?Delphi竟比vc++还快
只看楼主
lzb6689
Rank: 1
等 级:新手上路
帖 子:46
专家分:0
注 册:2007-11-9
结帖率:50%
已结贴  问题点数:20 回复次数:15 
大家帮看看,怎么回事?Delphi竟比vc++还快

前天有一个求素数个数问题,用delphi7.0求得100000000以内素数用时21.234秒,为想更快一点,把代码变为C语言后用vc++6.0计算居然要27.578秒,故把代码贴出,大家帮忙查找原因?
Delphi7.0代码:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls,math;

type
  TForm1 = class(TForm)
    Label1: TLabel;
    Edit1: TEdit;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var i, j, k, l,m,n,r:integer;
      d,s:integer;
      x,z,t,t1,t2: double;
      a:array of integer;
    ss:string;
begin
     t1:=now;
     ss:=trim(self.Edit1.Text );
     if ss<>'' then n:=strtoint(ss) else n:=0;
     setlength(a,n+1);
     m:=0;s:=0;
         if (n=2) then
         begin
                m:=1;a[m]:=2;s:=2;
             end;
         if (n=3) then
         begin
                m:=1;a[m]:=2;s:=2;
             m:=2;a[m]:=3;s:=5;
         end;
         if (n>3)  then
         begin
                m:=1;a[m]:=2;s:=2;
                m:=2;a[m]:=3;s:=5;
                for i:=4 to n do
                 begin
                         x:=i;z:=sqrt(x);l:=trunc(z)+1;k:=0;
                        for  j:=1 to m  do
                      begin
                       if (a[j]>l) then break;
                       r:=i mod a[j];
                       if (r = 0) then
                       begin
                             inc(k);break;
                       end;
                end;
                if (k = 0) then
                begin
                       inc(m);
                       s := s + i;
                       a[m]:=i;
                end;
          end;
         end;
            
                t2:=now;
            t:=(t2-t1)*86400;     
            ss:=floattostr(t);
            self.Label5.Caption  :=ss;
            ss:=inttostr(m);
            self.Label3.Caption  :=ss;
            
end;

end.
vc++6.0代码:
// suhucs.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
#include <malloc.h>
int main(int argc, char* argv[])
{
int i, j, k, l,m,n,r;
      int d,s;
      double x,z,t;
      clock_t begin,end;
      int *a;      
        printf("n=");
        scanf("%d",&n);
         printf("\n");   
         a=(int *)malloc((n+1)*sizeof(int))   ;
         begin=clock();
         m=0;s=0;
         if(n==2)
         {
             m=1;a[m]=2;s=2;
         }
         if(n==3)
         {
             m=1;a[m]=2;s=2;
             m=2;a[m]=3;s=5;
         }
         if(n>3)
         {
             m=1;a[m]=2;s=2;
             m=2;a[m]=3;s=5;
             for(i=4;i<=n;i++)
             {
                 x=i;z=sqrt(x);l=(int)z+1;k=0;
                 for( j=1;j<= m;j++)
                 {
                       if(a[j]>l)break;
                       r=i%a[j];
                    if (r == 0) {
                        k++;break;
                    }
                    
                }
                if (k == 0) {
                    m++;
                    s = s + i;
                    a[m]=i;
                }
               
            }
        }
            
         end=clock();
            t=(double)(end-begin)/CLOCKS_PER_SEC;
            printf("素数个数=%d\n",m);
            printf("计算时间=%f",t);
            free(a);
    system("pause");
    return 0;
}
搜索更多相关主题的帖子: procedure Windows C语言 
2015-04-26 13:53
lzb6689
Rank: 1
等 级:新手上路
帖 子:46
专家分:0
注 册:2007-11-9
得分:0 
计算结果贴图:
delphi7.0

vc++7.0

2015-04-26 13:55
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
得分:4 
谁告诉你C一定比Delphi快的?快慢的关键是算法,不是语言。

授人以渔,不授人以鱼。
2015-04-26 20:58
lzb6689
Rank: 1
等 级:新手上路
帖 子:46
专家分:0
注 册:2007-11-9
得分:0 
同样的算法,vc++6.0不应比delphi7.0慢那么多。
2015-04-27 19:27
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
得分:4 
那是你自以为两者对内存管理的机制有可比性,Pascal的强项就是数学运算,尤其是整数,你的C数据在堆上访问,人家不是,你想当然用指针比数组快而已。

授人以渔,不授人以鱼。
2015-04-27 21:49
jklqwe111
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:35
帖 子:335
专家分:1125
注 册:2014-4-13
得分:4 
程序运行时间长还是应该先从算法上进行改进,其次从代码上进行优化也很有必要,看楼主的代码从提高运算速度上来讲还是有很多可改的地方的。
2015-04-27 22:29
lzb6689
Rank: 1
等 级:新手上路
帖 子:46
专家分:0
注 册:2007-11-9
得分:0 
引用楼上“程序运行时间长还是应该先从算法上进行改进,其次从代码上进行优化也很有必要,看楼主的代码从提高运算速度上来讲还是有很多可改的地方的。”
楼主说说有什么方法该进可以使它运行更快点?

2015-04-29 10:11
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
得分:4 
回复 7楼 lzb6689
用帅选法不到4秒,还包含一亿个数组值置1的时间。代码如下:
程序代码:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define n 100000000
void main()
{
    int i,j,k;
    char *p;
    long t;
    p=(char*)malloc(n*sizeof(char));
    t=clock();
    for(i=0;i<n;i++)p[i]=1;
    for(i=2,k=0;i<n;i++)
    {
        if(p[i])
        {
            for(j=i+i;j<n;j+=i)p[j]=0;
            k++;
        }
    }
    printf("共查到%d个素数,用时:%f 秒\n",k,(float)(clock()-t)/1000);
    free(p);
}

本机配置及运行结果图如下:

能编个毛线衣吗?
2015-04-29 10:42
AleTiff
Rank: 3Rank: 3
等 级:论坛游侠
威 望:4
帖 子:64
专家分:157
注 册:2015-3-30
得分:4 
代码我没测试,就拿楼主的测试来说,Delphi 程序在运行前,Delphi 这个框架就利用 GetMem() 向系统申请了一大块内存,以后程序需要内存的时候,不再调用系统的内存分配 API,而是直接用已经预申请的内存池里进行分配。这个特点加速了 Delphi 程序的运行,还有一个好处是:当有错误发生的时候,可以直接通过遍历 Delphi 的 MM (内存管理器)来获得非常具体的出错信息。

C 语言不是那种自带框架的语言,但也不是不能做到这样的效果,就是自己开内存池,缺点无非是,人家是写好直接可以用的而已。
2015-04-29 11:14
lzb6689
Rank: 1
等 级:新手上路
帖 子:46
专家分:0
注 册:2007-11-9
得分:0 
回 8楼 wmf2014
楼主的算法很神奇,我也看了较长时间才弄懂,比我的方法快多了,看来还是算法比语言重要啊。我用vc++6.0编译后计算结果与楼主一样:
2015-04-29 14:37



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-444510-1-1.html




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

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