具有可选参数的性能与可读性

时间:2013-12-13 11:39:11

标签: c++ performance

假设我必须为类中包含的向量的每个成员调用相同的方法 如果向量的element-i有一定的值,我必须修改它 我在此向量中 max 10 元素。

最好的方法是什么?
- 使用可选参数调用方法?
- 或者在里面调用if-else语句的方法?

class A {   
  public:    
   A();   
   void doSomething(const string& s) {   
      if(s=="foo") {  
        std::cout << s;   
      } else {   
        std::cout << s << ".dat"   
      }   
    }    
    void doSomethingDef(const string& s, const string& v = "")  {   
      std::cout << s << v;   
    }      
  private:   
    std::vector<std::string> list_;      
}  

int main() {   
  A a;  
}  


/* Constructor with method 1 */   
A::A() {    
 std::vector<std::string>::iterator i = list_.begin();     
 for(; i != list_.end(); ++i) {    
   this->doSomething(*i);    
 }     
}   

/* Constructor with method 2 */   
A::A() {    
   this->doSomethingDef(list[0]);   
   this->doSomethingDef(list[1]);   
   this->doSomethingDef(list[2]);  
   this->doSomethingDef(list[3]);    
   this->doSomethingDef(list[4], ".dat");  
   this->doSomethingDef(list[5], ".dat");  
   this->doSomethingDef(list[6]);  
   this->doSomethingDef(list[7]);  
   this->doSomethingDef(list[8]);  
   this->doSomethingDef(list[9]);  
}   

3 个答案:

答案 0 :(得分:3)

如果你最多有10个元素,我会声称性能完全无关紧要。

此外,在你证明性能真的很重要之前,方法1更具可读性,无论如何你应该更喜欢它。

最后,由于cout操作的工作方式,我猜想在这个小例子中,方法2实际上更慢,因为执行分支和与固定字符串进行比较要比对格式化执行额外调用更快输出功能。

答案 1 :(得分:1)

在C ++ 11中,使用方法1的构造函数可以写成:

A::A()
{
    for(const auto & listElement : list_)
    {
        this->doSomething(listElement);
    }
}

性能和可读性以及更具通用性的引导。或者您可以使用std :: for_each和lambda函数来执行此操作,该函数可以触发打开优化的编译器为您展开该循环。

A::A()
{
    for_each(begin(list_), end(list_),[this](const std::string & listElement)
    {
        doSomething(listElement);
    });
}

答案 2 :(得分:0)

如果您决定使用与您的第二种方法类似的东西(不是我建议它,只考虑如何如果你这样做),我强烈< / em>考虑使用重载而不是默认参数:

void doSomethingDef(const string& s)  {   
  std::cout << s;   
}

void doSomethingDef(const string &s, const string &v) {
   std::cout << s << v;
}

使用默认参数,您仍然创建一个临时字符串并将其作为第二个参数传递,然后进行所有iostreams调用以将该字符串插入流中,即使它没有效果。通过使用重载,您可以避免创建,传递和插入第二个字符串所需的所有处理(当然,除非您确实要显示第二个字符串)。

将它与I / O混合(并且只写10个字符串)可能会从中获得大部分好处,所以它甚至可能很难测量,更不用说在现实生活中注意了。另一方面,如果你生成了很多字符串并且(例如)将输出存入内存而不是将其写入输出,那么差异可能会变得很大。