向#define专家提问 - 页 9

 
Alexandr Andreev:

这并不总是有效。


这不是正确的测试,因为循环体是不同的。
第二个机构有更多的指示cnt--
所以这不是我正确的测试。
对于PI,我认为它更正确。

 
Roman:

这不是正确的测试,因为循环体是不同的。
第二个机构也有指示cnt--
这不是我正确的测试。
对于PI,我认为它更正确。

这只是生活的方式,测试在使用和常识方面是正确的。在任何我们改变数组本身大小的循环中,都会有完全相同的代码。这个例子是正确的。

但是,PI就在那里,而且结果也不是明显的单向,请看一下。

 
Alexandr Andreev:

这正是生活的方式,一个在用法和常识上不正确的测试。
在任何我们改变数组本身大小的循环中,都会有完全相同的代码。这个例子是正确的。

但PI是存在的,而且结果也不是明显地朝一个方向。

但它怎么会是正确的呢?
如果在循环体中有更多的指令,在迭代过程中就会执行更多的代码,一个额外的指令会被递增。
,这就增加了执行时间。这是符合逻辑的。
而当这些机构是相同的时候,评估对循环条件的引用已经很安全了。

 
Roman:

它是如何正确的?
如果在循环体中有更多的指令,在迭代过程中就会执行更多的代码,一个额外的指令会被递增。
,这就增加了执行时间。这是符合逻辑的。
而当机构相同时,我们已经可以安全地估计到循环条件的调用。

))))

这不是所有的教条都是正确的。你在运行之间(运行更频繁,编译更多的运行--单程),所以单程的计算差异要大于你的计算值。差异是由系统的当前任务造成的。即被检查的价值份额太小,为了增加它,你必须增加身体中这些功能的数量....。并采取最便宜的操作。而这就是乘法!......我还没有找到另一个人。例如,我的例子使用了一次除法--这比π的计算方式要少很多倍,在那里还使用了类型重影(相当昂贵的过程)。

 
Alexandr Andreev:

))))

这不是所有教规都正确的。你在运行之间(做更多的运行,做编译更多的运行--单向),所以你在运行之间的计算差异比宣称的价值要大。差异是由系统的当前任务造成的。即被检查的价值份额太小,为了增加它,你必须增加身体中这些功能的数量....。并采取最便宜的操作。而这就是乘法!......我还没有找到另一个人。例如,我的例子使用了一个除法--这比π的计算方式要少很多倍,在那里还使用了类型重影(相当昂贵的过程)。

再一次。被测试的不是循环体,而是循环条件。
循环的主体必须是相同的,以衡量条件是否得到满足。
否则,由于各机构执行的时间不同,测量时间也会不同。
这就是我们在这种情况下得到的结果,因为有一条额外的指令cnt------。

 
void OnStart()
  {
   int mas[];
   int mas1[300];
   int mas2[300];
   int mas3[300];
   int mas4[300];
   int mas5[300];
   int mas6[300];
   int z=300;
   int size=1000000000;
   ArrayResize(mas,size);
   int r=0;
   int r1=0;
   int r2=0;
   int random;
   ulong max=100; 
   int t=0;
   int tr=0; 
   MathSrand(10);
    int num_steps=ArraySize(mas);
    double x, pi, sum=0.0;
    double step = 1.0/(double)num_steps;
    
     int v=size;
    ulong t1 = GetMicrosecondCount();
     
    
  // for(ulong z=0; z<max; z++)
     {
      for(int i=0; i<ArraySize(mas); i++)
        {  
        r2+=ArraySize(mas);
        r2<<=3;
        }

     }  
   ulong t2=GetMicrosecondCount();
   //for(ulong z=0; z<max; z++)
   int sizem=ArraySize(mas);
     {
      for(int i=0; i<sizem; i++)
        { 
        r2+=sizem;
        r2<<=3;
        
        }
     }
    
   ulong t3=GetMicrosecondCount();
   Print(t2-t1,"  ",t3-t2," ",r2," ",r1);
// Templ();
  }

一般来说,事实证明,在宽恕和二进制移位之间交替进行(这是最便宜的操作之一)也会影响到.... 的计算。没有任何区别,这就是裁决。
 
Roman:

再一次。被测试的不是循环体,而是循环条件。
循环体必须是相同的,以便测量是否满足条件。
否则,测量时间将是不同的,因为各机构执行的时间不同。
在这种情况下,我们得到了,因为有一个额外的指令cnt --

事实上,我的文字正是关于与π的方式

 
我甚至不敢问#define的问题
 
Алексей Тарабанов:
我甚至不敢问#define的问题

让我们更多地讨论一下定义。
根据我的理解,它不会给可执行文件带来运行时的提升。

 
Roman:

让我们更多地讨论一下定义。
据我所知,它在可执行文件中没有给出一个执行增量。

好的。首先是定义,然后是可执行文件,然后是可执行文件的执行。