Мне поручено две программы, и это вторая. Первая программа не включала функцию 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;
}
Компилятор просто игнорирует это?
Скорее всего, да. Это может быть сделано по двум причинам:
inline
ключевые слова игнорируются для облегчения отладки.inline
- это компилятор HINT, а не обязательное требование. Это способ программиста рекомендовать компилятору встроить функцию, точно так же, как компилятор в режиме выпуска часто будет встроить собственные функции для повышения производительности. Если он видит только отрицательное значение, он не будет соответствовать.Кроме того, с учетом единственного вызова очень маловероятно, что вы даже увидите различия независимо от того, работает оно или нет. Один нативный вызов функции намного проще в CPU, чем один переключатель задач на уровне ОС.
Вы должны отключить оптимизацию, чтобы убедиться, что то, что вы делаете, имеет какой-либо эффект, потому что есть хорошие шансы, что компилятор уже встраивает эту функцию сам по себе.
Кроме того, если вы хотите точно знать, что делает ваш код, вы должны скомпилировать флаг -s в g++ и посмотреть на сборку, сгенерированную компилятором для вашей программы. Это устранит всю неопределенность в отношении того, что компилятор делает с вашей программой.
Я бы не сделал функцию вложенной и определял массивы как статические. Например
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';
}
}