Мне поручено две программы, и это вторая. Первая программа не включала функцию вычисления () и рассчитывала время начала, когда программа начиналась и заканчивалась. Мой компьютер будет отображать что-нибудь от 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
Ключевое слово является компилятором ПОДСКАЗКА, не обязательное требование. Это способ программиста рекомендуя компилятор для встраивания функции, так же, как компилятор в режиме релиза, будет часто встраивать функции самостоятельно для увеличения производительности. Если он видит только отрицательное значение, он не будет соответствовать.Кроме того, учитывая один вызов, маловероятно, что вы даже увидите различия, независимо от того, работает он или нет. Одиночный вызов родной функции намного проще в ЦП, чем один переключатель задач на уровне ОС.
Вы должны отключить оптимизацию, чтобы проверить, имеет ли то, что вы делаете, какое-либо влияние, потому что есть хорошие шансы, что компилятор уже встроил функцию сам по себе.
Также, если вы хотите точно знать, что делает ваш код, вы должны скомпилировать с флагом -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';
}
}