我有一个如下所示的字符串:
{A}jahshs{b}jwuw{c}wuqjwhaha{d}{e}{f}jsj{g}
我需要更换每一个{x}
用不同的字符串。问题来了,因为这个过程将重复大约 1000 次/秒,所以我需要一种优化/快速的方法来完成它。
任何想法?加强替换?升压格式? ETC..
-
预分配所有缓冲区
....
profit
哦,还有不要发垃圾邮件。 5 10 分钟内的示例代码。
好的,这里是:也住在科里鲁 http://coliru.stacked-crooked.com/a/04acff1610ced10d
#include <string>
#include <sstream>
#include <boost/utility/string_ref.hpp>
template <typename Range>
int expand(Range const& /*key*/)
{
return rand()%42; // todo lookup value with key (be sure to stay lean here)
}
#include <iostream>
int main()
{
static const std::string msg_template = "{A}jahshs{b}jwuw{c}wuqjwhaha{d}{e}{f}jsj{g}\n";
std::ostringstream builder;
builder.str().reserve(1024); // reserve ample room, not crucial since we reuse it anyways
for (size_t iterations = 1ul << 14; iterations; --iterations)
{
builder.str("");
std::ostreambuf_iterator<char> out(builder);
for(auto f(msg_template.begin()), l(msg_template.end()); f != l;)
{
switch(*f)
{
case '{' :
{
auto s = ++f;
size_t n = 0;
while (f!=l && *f != '}')
++f, ++n;
// key is [s,f] now
builder << expand(boost::string_ref(&*s, n));
if (f!=l)
++f; // skip '}'
}
break;
default:
*out++ = *f++;
}
}
// to make it slow, uncomment:
// std::cout << builder.str();
}
}
这在我的系统上运行大约需要 0.239 秒。大约每秒 68k 扩展.罢工>
哎呀。在releasebuild 它每秒进行 400 万次扩展。在Coliru 达到每秒近 100 万次扩展 http://coliru.stacked-crooked.com/a/d4b19b312b5a570f.
改进空间:
- 您可以预先验证输入
- 如果您知道参数键始终为 1 个字母,那么您只需将 string_ref 替换为 char,并且不循环
'}'
.
- 您可以预先计算参数的索引并继续前进。这里的好处不是那么确定(顺序内存访问在某些处理器上非常好,并且简单的方法可能会更快)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)