标题:大家帮看看,怎么回事?Delphi竟比vc++还快
只看楼主
lzb6689
Rank: 1
等 级:新手上路
帖 子:46
专家分:0
注 册:2007-11-9
得分:0 
回复9楼 AleTiff
同意楼主的观点,但就我的经验来说,同样算法大多数计算几乎都是vc++比delphi略快,这一例是个例外,我把8楼 wmf2014的代码转为delphi后也是这样。

2015-04-29 14:53
tlliqi
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:204
帖 子:15453
专家分:65956
注 册:2006-4-27
得分:0 
关键是算法
2015-04-29 14:57
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
得分:0 
回复 11楼 lzb6689
将8楼代码中语句“for(j=i+i;j<n;j+=i)p[j]=0;”改为“for(j=i+i;j<n;j+=i)if(p[j])p[j]=0;”可将速度提高1秒。
仔细看了dephli代码,开始以为是while循环比for快,结果更换反而更慢,后认为是指针访问没数组快,在c里定义全局大数组后速度没有改观,最后我认为是dephli对多重循环有代码优化功能造成的,比如我内循环使用的j+=i命令,在汇编一级是反复从内存取出i值再和j相加,其实优化的话,在这个内循环里只需要一次把i值取出到ecx寄存器,把ecx作为临时i变量即可,这样不需要在内存中反复取值,可以大大缩短时间的,我估计dephli的inc(j,i)指令会做这个优化,再就是c的++、--指令并没有产生优化的inc、dec汇编指令,仍然是繁琐的取内存值到寄存器,寄存器加1、存寄存器值到内存,反正我使用的vc跟踪到汇编一级就是这些指令,浪费了大量不需要的取值存值时间。

说c的编译效率高、运行速度快,这是和其他语言全面比较、整体比较而得来的,不能就某一局部比较来论优劣胜负。

[ 本帖最后由 wmf2014 于 2015-4-30 07:26 编辑 ]

能编个毛线衣吗?
2015-04-30 07:16
jklqwe111
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:35
帖 子:335
专家分:1125
注 册:2014-4-13
得分:0 
对于楼主的c代码可以按以下方法改进。
对于2以外的素数是奇数的子集,与偶数无关,所以  for(i=4;i<=n;i++);这句可改为  for(i=5;i<=n;i+=2);这样循环会减少很多
    对于大循环,循环体的效率至关重要
   x=i;z=sqrt(x);l=(int)z+1;改为   l=sqrt(i)+1;会更好,对于其他语句也有可改进的地方。
由于算法的原因,运算效率是无法达到8楼的程序的,所以8楼的代码很值得学习,斟酌。我在看8楼的代码时,感觉还是有一点缺陷的,可以做如下验证,n=2 m(预期输出)=1
n=3  m=2
n=5  m=3
n=6 m=3
n=7 m=4
n=8 m=4
当输入为素数时结果少1,n值未统计

#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-1])//代表数据的位序值与记录能否被整除的数组的下标有1的差值
        {
            for(j=i+i;j<=n;j+=i)p[j-1]=0;
            k++;
        }
    }
    printf("共查到%d个素数,用时:%f 秒\n",k,(float)(clock()-t)/1000);
    free(p);
}

[此贴子已经被作者于2016-4-23 19:35编辑过]

2015-05-01 17:34
lzb6689
Rank: 1
等 级:新手上路
帖 子:46
专家分:0
注 册:2007-11-9
得分:0 
回 13楼 wmf2014
看了版主的回复,很佩服版主的研究深度,看得出版主对算法很有研究,其实我对算法一直都比较关注,版主有兴趣可加我的QQ:1754960606。
对于while for  do...while、甚至goto这几个循环我曾经做过测试,速度是一样的,不会有太大的差别。在循环方面delphi比c/c++快一点,在数组方面c/c++不知道(全局数组、指针数组、类定义数组等)哪种更快,使用时感觉时快时慢。

2015-05-01 21:01
lzb6689
Rank: 1
等 级:新手上路
帖 子:46
专家分:0
注 册:2007-11-9
得分:0 
回 14楼 jklqwe111
楼主看的比较仔细,这样确实快一些,不过我们这种直接求解的方法循环比较多,计算量大,速度快不起来,寻找高效方法是关键。
2015-05-01 21:12



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




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

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