假设有一段代码占用整个程序时间的一大部分(约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?)
答案 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,那就是偏执(检查返回值,角落情况等)。