2017-02-02 3 views
0

Я написал заголовок для обр класса в arr.h с перегруженной = оператора для 1D-массива и проверены на время, необходимое дляг ++ оптимизация для перегрузки оператора

A=B, где A, B массивов.

Время было сравнимо со временем в простом цикле для double массива (без класса arr) для оптимизации уровня менее чем 3.

#!/bin/bash 

FLAG=$1 
echo $FLAG 

g++ -o main $FLAG -std=c++11 main.cpp -DARR && main 
g++ -o main $FLAG -std=c++11 main.cpp   && main 

# end of the script 

CMP -O0; CMP-O1; CMP-O2; CMP-O3; CMP -Ofast

дает

-O0

  • с ARR: 1.5790530000000000e + 00 4.3474900000000000e-01 2.0138020000000001e + 00
  • без ARR: 4.0454800000000002e-01 4.4675500000000001e- 01 8.5130300000000003e-01

-O1

  • с ARR: 8.7386200000000003e-01 2.8413300000000002e-01 1.1579950000000001e + 00
  • без ARR: 3.3455699999999999e-01 3.5522599999999999e-01 6.8978300000000004e-01

-O2

  • с ARR: 7.2507600000000005e-01 2.3888400000000001e-01 9.6396000000000004e-01
  • без ARR: 3.3509400000000000e-01 3.5229899999999997e-01 6.8739300000000003e-01

-O3

  • с ARR: 6.1693299999999995e-01 2.3233400000000001e-01 8.4926699999999999e-01
  • без ARR: 2.3794000000000001e-01 1.9999999999999999e-06 2.379419999999999999-01

-Ofast

  • с ARR: 6.2396699999999994e-01 2.3364900000000000e-01 8.5761599999999993e-01
  • без ARR: 2.3897499999999999e-01 1.9999999999999999e-06 2.3897699999999999e-01

Но для -O3 и -Ofast Простая петля демонстрирует резкое уменьшение времени (вторая колонка с числами).Как получить тот же результат для класса arr?

main.cpp

#include <iostream> 
#include <iomanip> 
#include <time.h> 

#ifdef ARR 
#include "arr.h" 
#endif 

using namespace std; 

int main() { 
    int n=1e8; 
    register int i; 

    clock_t time1=clock(),time2,time3=0; 

#ifdef ARR 
    arr<double> A(n),B(n); 

    for (i=0; i<n; i++) 
     B(i)=i; 
#else 
    double * A = new double [n]; 
    double * B = new double [n]; 

    for (i=0; i<n; i++) 
     B[i]=i; 
#endif 

    time2=clock(); 

#ifdef ARR 
    A=B; 
#else 
    for (i=0; i<n; i++) 
     A[i]=B[i]; 
#endif 

    time3=clock(); 

#ifdef ARR 
    cout<<fixed<<setw(16)<< scientific <<setprecision(16) <<" with ARR: "<<(time2-time1)/ (double)CLOCKS_PER_SEC<< " "<< (time3-time2)/ (double)CLOCKS_PER_SEC<< " "<< (time3-time1)/ (double)CLOCKS_PER_SEC<<endl; 
#else 
    cout<<fixed<<setw(16)<< scientific <<setprecision(16)<<" without ARR: "<<(time2-time1)/ (double)CLOCKS_PER_SEC<< " "<< (time3-time2)/ (double)CLOCKS_PER_SEC<< " "<< (time3-time1)/ (double)CLOCKS_PER_SEC<<endl<<endl; 
#endif 

    return 0; 
} 

arr.h

#ifndef ARR_H 
#define ARR_H 

using namespace std; 

template <class T> class arr 
{ 
public: 
    T* data; 
    int size, dim=0; 
    int dim1=0, dim2=0, dim3=0, dim4=0; 
    int shape[4]; 

    arr() { } 

    arr(const int & isize) { // constructor 
     dim=1; 
     size=isize; 
     dim1=size; 
     data = new T[size]; 
     shape[0]=size; 

     register int i; 
     for (i=0; i<size; i++) 
      data[i]=0.; 
    } 

    ~arr() { delete [] data; } 

    T &operator()(const int & index) { 
     return data[index]; 
    } 

    arr &operator=(const arr & A) { 
     register int i; 
     for (i=0; i<size; i++) 
      data[i]=A.data[i]; 
     return *this; 
    } 

    arr &operator=(const T & A) { 
     register int i; 
     for (i=0; i<size; i++) 
      data[i]=A; 
     return *this; 
    } 
}; 

#endif /*ARR_H */ 

ответ

0

Так как вы ничего с A не делать после копирования массива, оптимизатор полностью удалить петлю. Вам нужно использовать некоторое значение в массиве A (например, вывести один элемент массива в ваш оператор cout).

Смежные вопросы