0

我的任务是两个程序,这是第二个。第一个程序不涉及calculation() 函数,并在程序启动和结束时为程序计时。我的电脑将显示从 0.523 秒到 0.601 秒的任何内容。

第二个任务是为计算创建一个内联函数,我认为我做错了,因为它并不快。我不确定我是否正确地使用了计算函数,因为它包含显示信息,或者内联函数是否应该只关注乘法。无论哪种方式,将数组从主函数中拉出并进入函数都不会更快。

编译器只是忽略它吗?

#include <ctime>
#include <iostream>
using namespace std;

  inline int calculation(){
  int i;
  double result[10000];

double user[10000];
   for(i=0; i<10000; i++){
      user[i]=i+100;    
   }

    double second[10000];
   for(i=0; i<10000; i++){
      second[i]=10099-i;    
   }

    for (i = 0; i < 10000; i++){
       result[i] = user[i] * second[i];
    }

    for (i = 0; i < 10000; i++){
       cout << user[i] << " * " << second[i] << " = " << result[i] << '\n';
       }
   }


    int main() {

    time_t t1 = time(0);                  // get time now
    struct tm * now = localtime( & t1 );
    cout << "The time now is: ";
    cout  << now->tm_hour << ":" << now->tm_min << ":" << now->tm_sec << endl;

    clock_t t;                        // get ticks
    t = clock();
    cout << " Also calculating ticks...\n"<<endl;

    calculation();                    // inline function

    time_t t2 = time(0);                  // get time now
    struct tm * now2 = localtime( & t2 );
    cout << "The time now is: ";
    cout << now2->tm_hour << ":" << now2->tm_min << ":" << now2->tm_sec << endl;
    time_t t3= t2-t1;

    cout << "This took me "<< t3 << " second(s)" << endl;  // ticks
    t = clock() - t;
    float p;
    p = (float)t/CLOCKS_PER_SEC;
    cout << "Or more accuratley, this took " << t << " clicks" 
    << " or " << p << " seconds"<<endl;

    }
4

3 回答 3

1

编译器只是忽略它吗?

很可能,是的。这样做可能有两个原因:

  • 您正在调试模式下编译。在调试模式下,所有inline关键字都被忽略以方便调试。
  • 它忽略了它,因为该函数对于内联函数来说太长了,并且使用了太多的堆栈空间来安全地内联,并且只被调用一次。inline关键字是编译器HINT 不是强制性要求。这是程序员推荐编译器内联函数的方式,就像发布模式下的编译器会频繁地自行内联函数以提高性能一样。如果它只看到负值,它就不会遵守。

此外,考虑到单次调用,无论它是否有效,您都不太可能看到差异。CPU 上的单个本机函数调用比操作系统级别的单个任务切换要容易得多。

于 2013-12-21T00:32:31.280 回答
0

您应该禁用优化以验证您所做的是否有任何影响,因为编译器很有可能已经自行内联函数。

此外,如果您想确切地知道您的代码做了什么,您应该在 g++ 中使用 -s 标志进行编译,并查看编译器为您的程序生成的程序集。这将消除编译器对您的程序所做的所有不确定性。

于 2013-12-21T00:31:23.120 回答
0

我不会将函数内联并将数组定义为静态的。例如

int calculation(){
  int i;
  static double result[10000];

static double user[10000];
   for(i=0; i<10000; i++){
      user[i]=i+100;    
   }

    static double second[10000];
   for(i=0; i<10000; i++){
      second[i]=10099-i;    
   }

    for (i = 0; i < 10000; i++){
       result[i] = user[i] * second[i];
    }

    for (i = 0; i < 10000; i++){
       cout << user[i] << " * " << second[i] << " = " << result[i] << '\n';
       }
   }
于 2013-12-21T00:33:42.477 回答