2015-08-19 4 views
1

Я пытался выяснить, быстрее ли давать функцию аргумент или просто использовать переменные-члены. У меня есть следующий код.Member Variable vs. Function Аргумент

class Variable 
{ 
    private: 

    public: 
     Variable() {} 
     ~Variable() {} 

     struct 
     { 
      static const int test = 3; 
     }testVar; 
}; 

class VariableTransmit 
{ 
    private: 
     Variable var; 

    public: 
     VariableTransmit() {} 
     ~VariableTransmit() {} 

     void testFunc1(int test) 
     { 
      int foo = 2; 
      foo = test; 
     } 

     void testFunc2() 
     { 
      int foo = 2;  
      foo = var.testVar.test; 
     } 

}; 

struct 
{ 
    static const int test = 3; 
}extVar; 

int main(void) 
{ 
    VariableTransmit transmit; 

    clock_t prgstart, prgend; 
    prgstart = clock(); 

    for(int i = 0; i <= 10000000; i++) 
    { 
     transmit.testFunc1(extVar.test); 
    } 

    prgend = clock(); 
    printf("delivered: %.5f seconds\n\n", (float)(prgend - prgstart)/CLOCKS_PER_SEC); 

    prgstart = clock(); 

    for(int i = 0; i <= 10000000; i++) 
    { 
     transmit.testFunc2(); 
    } 

    prgend = clock(); 
    printf("member: %.5f seconds\n\n", (float)(prgend - prgstart)/CLOCKS_PER_SEC); 

    return 0; 
} 

Я протестировал этот код, и к моему удивлению testFunc1 и testFunc2 имеют идентичную скорость обработки. Я думал, что testFunc1 будет быстрее, поскольку он получает значение как аргумент из структуры и просто должен его установить, в то время как testFunc2 должен получить доступ к объекту var, а затем получить значение из структуры внутри объекта. Является ли это оптимизацией для компилятора (я использую VS2010 кстати), или я просто что-то пропустил?

Редактировать: Убрано второе задание на то, чтобы быть основанным на мнениях.

+0

У вас включена оптимизация? Каковы были ваши результаты? – NathanOliver

+1

Я бы не удивился, если компилятор полностью исключает обе петли. Я хотел бы видеть тайминги, которые у вас есть, или сгенерированный код ассемблера. –

+0

У меня нет специального флага оптимизации. Я не знаю, устанавливает ли vs2010 оптимизацию по умолчанию. Если нет, то никакой оптимизации. Оба, где в 0,023 сек. – YokeM

ответ

0

Ваш пример будет оптимизирован с помощью компилятора visual-C++. testFunc1 может быть даже медленнее, в зависимости от регистра, используемого для прохождения test, а testFunc2 копий от всегда одинаково виртуальный адрес.

Почему? Ваш Variable var создан в стеке. Он будет создан при создании объекта, и, таким образом, компилятор может предсказать его виртуальный адрес. (Вы можете создать объект Variable в куче и, следовательно, иметь немного более длительное время выполнения.)

[О публичных/частных вещах: обычно вы можете делать, как вам будет угодно. Я лично считаю, что в многопоточных средах создание внутренних структур классов представляет более высокий риск случайных условий гонки.]