更快地转换为字符串

时间:2013-07-24 15:00:08

标签: c++ optimization micro-optimization

假设有一段代码占用整个程序时间的一大部分(约20%),它包括从给定类型转换(在选项中:string,char,short,int,float,unsigneds, ...)字符串。这样做的简单方法就是:

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?)

2 个答案:

答案 0 :(得分:3)

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

例如:

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

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

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

答案 1 :(得分:3)

几点:

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

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

  • ostringstream不是为了提高性能,而是为了统一,可扩展的缓冲输出(buffered = slow)。

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

    如果你确实使用sprintf,那就是偏执(检查返回值,角落情况等)。