2

假设有一段代码占用了整个程序时间的很大一部分(~20%),它包括从给定类型转换(在选项中:字符串、字符、短、整数、浮点、无符号...... ) 到字符串。执行此操作的简单方法如下:

template<class T>
string toString(T sAttrvalue) {
    stringstream ss;
    ss << T;

    string res=ss.str();

    if(res=="x" || res=="y")
        return "k";

    return res;
}

但是性能太差了(即使它通过使用静态字符串流并在函数开头执行 ss.str("") 来提高)。

关于如何让它更快的任何其他想法?(您会如何看待使用另一个指定时间的函数参数并从那里使用 sprintf?)

4

2 回答 2

3

除了您提供的代码之外,您还可以尝试使用template specialization来优化最常见的情况(例如,vector<bool>这样可以更节省空间)。

例如:

template<>
string toString<char>(char sAttrValue) {
    ...
}

template<>
string toString<int>(int sAttrValue) {
    ...
}

对于其他类型,依此类推,每种类型都使用特定的转换方法并针对该类型进行了优化。与这些专用模板之一不匹配的任何类型都将回退到默认stringstream方法。

于 2013-07-24T15:06:19.560 回答
3

几点:

  • 为了准确测量,获取时间快照,在循环中调用函数 X 次(例如 X = 10000),然后再次获取时间(参见 参考资料clock())。从最终时间中减去初始时间并除以 X。

    这将为您提供准确的测量结果。

  • ostringstream 不是为性能而设计的,它是为统一的、可扩展的缓冲输出而设计的(缓冲 = 慢)。

    您应该按类型具体化模板并使用更快的替代方案。如果可能,不要切换到 sprintf,而是使用其他替代方案(itoa、直接分配字符串等)。

    如果您确实使用了 sprintf,请注意它(检查返回值、极端情况等)。

于 2013-07-24T15:35:17.707 回答