以下是一个解析文本文件的代码片段,算法是直接从C#里面移植过来的,基本没变,但是执行效率C#中下降了70%左右,下面这个for循环会被N次调用,大家帮忙看看吧。
for (int k=0;k<slenggth;k++)
       {
     double t1=GetTickCount();//程序段开始前取得系统运行时间(ms)
     ss=ReadFileString.GetAt(k);
 if (ss!="." && ss!= "-" && ss!= "0" && ss!= "1" && ss!= "2" && ss!="3" && ss != "4" && ss!= "5" && ss != "6" && ss!= "7" && ss!= "8" && ss!= "9" && ss!= " ")
    {
                       x2 = 0;
                       y2 = 0;
                       z2 = 0;
                     }
            if (ss== "x" || ss =="X") //x X
    {
                       x2 = 1;
                       y2 = 0;
                       z2 = 0;
                     }
                     if (ss=="y" || ss == "Y")//y Y
     {
                        x2 = 0;
                        y2 = 1;
                        z2 = 0;
                      }
                      if (ss== "z"|| ss== "Z") //z Z
      {
                        x2 = 0;
                        y2 = 0;
                        z2 = 1;
                       }
       if (x2 == 1 && ss!= "x" && ss != "X" && ss!= " ")
      {
 xs = xs+ss;
       }
       if (y2 == 1 && ss!= "y" && ss != "Y" && ss!= " ")
       {
 ys = ys +ss;
}
       if (z2 == 1 && ss!= "z" && ss != "Z" && ss!= " ")
       {
zs = zs +ss;
       }
   double t2=GetTickCount();//程序段开始前取得系统运行时间(ms)
  Version +=t2-t1;
}

解决方案 »

  1.   

    我觉得这不是代码的问题,因为是同样的代码放在不同的编译环境中。其原因是VC的编译效果要比C#的编译效果好得多,其生成的机器码要优化得多。因为VC是标准的Windows开发语言,比C#更接近底层。
      

  2.   

    if (ss!="." && ss!= "-" && ss!= "0" && ss!= "1" && ss!= "2" && ss!="3" && ss != "4" && ss!= "5" && ss != "6" && ss!= "7" && ss!= "8" && ss!= "9" && ss!= " ") 这个用单引号吧!
      

  3.   

    是C#中下降了70%还是VC中下降了70%,楼主说明白点啊
      

  4.   


    for (int k=0;k <slenggth;k++) 

    double t1=GetTickCount();//程序段开始前取得系统运行时间(ms) 
    char ss=ReadFileString.GetAt(k); 
    if (ss!='.' && ss!= '-' && ss > '9' && ss < '0' && ss!= ' ') 

    x2 = 0; 
    y2 = 0; 
    z2 = 0; 

    if (ss== 'x' || ss =='X') //x X 

    x2 = 1; 
    y2 = 0; 
    z2 = 0; 

    if (ss=='y' || ss == 'Y')//y Y 

    x2 = 0; 
    y2 = 1; 
    z2 = 0; 

    if (ss== 'z'|| ss== 'Z') //z Z 

    x2 = 0; 
    y2 = 0; 
    z2 = 1; 

    if (x2 == 1 && ss!= "x" && ss != "X" && ss!= " ") 

    xs = xs+ss; 

    if (y2 == 1 && ss!= "y" && ss != "Y" && ss!= " ") 

    ys = ys +ss; 

    if (z2 == 1 && ss!= "z" && ss != "Z" && ss!= " ") 

    zs = zs +ss; 

    double t2=GetTickCount();//程序段开始前取得系统运行时间(ms) 
    Version +=t2-t1; 

      

  5.   

    http://huic.72pines.com/105
    C#可能会快一点了,预编器有很大的关系了。
      

  6.   

    PS :翻译的方式有两种,一个是编译,一个是解释。两种方式只是翻译的时间不同。编译型语言写的程序执行之前,需要一个专门的编译过程,把程序编译成为机器语言的文件,比如exe文件,以后要运行的话就不用重新翻译了,直接使用编译的结果就行了(exe文件),因为翻译只做了一次,运行时不需要翻译,所以编译型语言的程序执行效率高。 解释则不同,解释性语言的程序不需要编译,省了道工序,解释性语言在运行程序的时候才翻译,比如解释性basic语言,专门有一个解释器能够直接执行basic程序,每个语句都是执行的时候才翻译。这样解释性语言每执行一次就要翻译一次,效率比较低。理论上,C++要快,但是Complier自身应该起很大的作用了。那么在intel多核技术的基础上,我想优化之后会更快.
      

  7.   

    把if放到外面再for不是很好吗
      

  8.   

    太感谢你了,就是字符比较比数值比较慢的原因,原来我也怀疑过,只是把某些数值比较改成了cstring.compare()方法,有点效果但是不明显,就是没想到用char,非常感谢!