С++ Встроенная функция для умножения массива на 10000

Мне поручено две программы, и это вторая. В первой программе не использовалась функция вычисления(), а программа замеряла время ее запуска и завершения. Мой компьютер будет отображать от 0,523 секунды до 0,601 секунды.

Второй задачей было создать встроенную функцию для расчета, и я считаю, что сделал это неправильно, потому что это не быстрее. Я не уверен, правильно ли я сделал функцию вычисления, потому что она включает отображаемую информацию, или встроенная функция должна фокусироваться только на умножении. В любом случае вытягивание массивов из main и в функцию не быстрее.

Компилятор просто игнорирует это?

#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;

    }

person user2899211    schedule 21.12.2013    source источник
comment
Просто из любопытства, каков максимальный размер кадра стека в вашей системе? В этой функции у вас почти 24 КБ двойных массивов. Это ооооочень много двойников :)   -  person Manu343726    schedule 21.12.2013
comment
Вы включаете линию печати при подсчете времени, что может стоить большей части вашего времени, поэтому даже если другие проблемы были решены, время может все еще не сильно измениться. При измерении времени следует учитывать только основные расчеты.   -  person phuclv    schedule 21.12.2013


Ответы (3)


Компилятор просто игнорирует это?

Скорее всего, да. Это может быть сделано по двум причинам:

  • Вы компилируете в режиме отладки. В режиме отладки все ключевые слова inline игнорируются для облегчения отладки.
  • Он игнорирует его, потому что функция слишком длинная для встроенной функции, использует слишком много места в стеке для безопасного встраивания и вызывается только один раз. Ключевое слово inline является СОВЕТОМ компилятора, а не обязательным требованием. Это способ программиста рекомендовать компилятору встроить функцию, точно так же, как компилятор в режиме выпуска часто встраивает функции самостоятельно для повышения производительности. Если он увидит только отрицательное значение, он не будет соответствовать.

Кроме того, учитывая единственный вызов, маловероятно, что вы даже увидите различия, независимо от того, работает он или нет. Вызов одной встроенной функции намного проще для ЦП, чем одно переключение задач на уровне ОС.

person Niels Keurentjes    schedule 21.12.2013

Вы должны отключить оптимизацию, чтобы убедиться, что то, что вы делаете, имеет какой-либо эффект, потому что есть хорошие шансы, что компилятор уже сам встраивает функцию.

Кроме того, если вы хотите точно знать, что делает ваш код, вам следует скомпилировать его с флагом -s в g++ и посмотреть на сборку, сгенерированную компилятором для вашей программы. Это устранит всю неопределенность в отношении того, что компилятор делает с вашей программой.

person Jules G.M.    schedule 21.12.2013

Я бы не стал делать встроенную функцию и определять массивы как статические. Например

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';
       }
   }
person Vlad from Moscow    schedule 21.12.2013
comment
Вы не заметили полосу прокрутки в его исходном коде - высота вызова чуть ниже высоты по умолчанию. - person Niels Keurentjes; 21.12.2013