减少大数据的条件语句

时间:2014-11-19 07:32:52

标签: c++ performance if-statement for-loop

我正在用C ++做一些示例程序。我在文本文件中有100,000个单列数据。我将所有数据加载到std :: vector中。现在我需要检查每个数据的第一个字符是“#”还是“%”或“$”。数据以“#”,“$”,“%”的方式排序。我可以像下面这样编程。

for ( i = 0; i < myArray.size(); i++)
{
  if(mrarray[i][0]=='#')
  {
    // do some process for '#' values
  }
 else if(mrarray[i][0]=='$')
  {
    // do some process for '$' values
  }
 else if(mrarray[i][0]=='%')
  {
    // do some process for '%' values
  }

}

我的问题是“这是一种最好的方式吗?。有没有其他方法可以更好地提高效率?”

2 个答案:

答案 0 :(得分:1)

它的效率与它一样高,唯一可以让它更快一点的就是使用switch语句。

for ( i = 0; i < myArray.size(); i++)
{
  switch(myArray[i][0]){
    case '#':
      // Do stuff
      break;
    case '$':
      // Do stuff
      break;
    case '%':
      // Do stuff
      break;
  }
}

我也假设你只做过一次。如果您使用相同的数据多次执行此操作,则可以通过对其进行排序来提高效率。如果是这样的话,请告诉我,我会更新我的答案。

答案 1 :(得分:1)

作为why-is-processing-a-sorted-array-faster-than-an-unsorted-array中的状态,可能更有效地排序您的行(基于第一个字符),然后处理您的向量。

大卫提出的转换声明将是我的选择。

但作为替代方案,您可以尝试一组函数指针,例如:

using my_function_pointer = void (*)(const std::string&/*, other required stuff*/);
const my_function_pointer funs[256] = { dummy_f, dummy_f, .., f_charp, f_dollar, f_mod, dummy_f, ..};

for ( i = 0; i < myArray.size(); i++) {
    funs[myArray[i][0]](myArray[i] /*, other required stuff*/);
}

无论如何,您需要根据任何优化对您的更改进行基准测试。