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

0

Мне поручено две программы, и это вторая. Первая программа не включала функцию calc() и времени программы, когда она начиналась и заканчивалась. Мой компьютер отобразит что-нибудь от 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;

    }
  • 0
    Просто из любопытства, каков максимальный размер кадра стека в вашей системе? В этой функции у вас есть почти 24 КБ двойных массивов. Это очень крутой дубль :)
  • 0
    Вы учитываете линию печати при подсчете времени, которое может стоить большую часть вашего времени, так что даже при решении других проблем время все равно может не сильно измениться. При измерении времени должны учитываться только основные расчеты.
Теги:
arrays
inline-functions

3 ответа

1
Лучший ответ

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

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

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

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

0

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

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

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';
       }
   }
  • 0
    Вы не заметили полосу прокрутки в его исходном коде - вызов чуть ниже высоты по умолчанию.
  • 0
    @Niels Keurentjes, да, вы правы. Поэтому я изменил свой пост.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню