瓶颈和不良样式代码
Bottleneck and bad style code
我写了一个程序,但我有一个性能问题。
瓶颈是这个功能:
void getlinesplit(const char *file, unsigned int &pos, tline &vline)
{
vline.clear();
unsigned int debut_du_mot = 0;
unsigned int i = 0;
while (file[pos+i] != 'n')
{
if (file[pos+i] == 't')
{
vline.push_back(std::string(file+pos+debut_du_mot,i - debut_du_mot));
debut_du_mot = i+1;
}
++i;
}
vline.push_back(std::string(file+pos+debut_du_mot,i - debut_du_mot));
pos = pos + i+1;
}
此函数被调用 11 988 400 次。
vline
是相同的字符串向量,以避免创建和破坏向量。
如何改进此功能?
PS:该行最多由1或2个单词组成。
很可能该函数不是瓶颈,而是您调用它 1200 万次的事实:-)
一个明显的改进是有一个变量
const char* file_pos = file + pos;
简化每次访问。你没有说tline是如何实现的;如果一行包含的单词永远不会超过两个,那么您可以通过使用两个 std::string 成员而不是数组来使其更快。
如果
可访问,从 C++17 开始std::experimental::string_view
应该会让百亿倍的速度更快。 如果没有,则类似的东西(开始/结束指针对或开始/长度)。
它写得也很笨拙,但我没有看到任何可怕的表现。
抛出一些对齐/长度保证,你可以 SSE 优化它,但这在用视图替换字符串旁边会很小,而且要困难得多。
任何好处都可能是有限的,因为情况可能是有限的。 获得更快的磁盘。
相关文章:
- 从 C 样式字符串中删除子字符串 "in place" 在C++代码中
- 代码样式:在 switch/if 语句的分支中重用控件表达式或控制变量
- C++代码::块大括号样式
- 禁用 Qt5 代码中的旧(Qt4 样式)信号槽语法
- 此代码中的数组初始化样式是什么?这是标准的吗?
- 此代码如何启动索引为 1 的 C 样式字符串
- 需要WXLISTCTRL的代码更改为虚拟样式WXListCtrl的工作代码
- 为什么两个相同的代码给出不同的输出,而它们之间的唯一区别是不同的变量名称和写作样式
- 从旧的 C 样式指针移动到C++智能指针,代码几乎没有变化
- 设置精度应用于旧的 C 样式代码
- 如何使用 for(int i:myVector) 代码样式知道元素是否是矢量中的最后一个元素
- C++模板样式代码
- 如何从代码中删除C样式注释
- C++:模板实现(代码样式)
- 通用配置代码的 Cmake 和编码样式
- C 样式转换是添加程序集(代码)还是仅供编译器了解情况
- 在 C++ 中链接"C"样式代码
- 带有返回的If语句代码样式
- 字体样式代码c#到c++
- 瓶颈和不良样式代码