Допустим, есть часть кода, которая занимает большую часть общего времени программы (~ 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?)
Вы можете попробовать использовать template specialization
в дополнение к приведенному вами коду, для оптимизации наиболее распространенных случаев (например, vector<bool>
может быть более экономичным).
Например:
template<>
string toString<char>(char sAttrValue) {
...
}
template<>
string toString<int>(int sAttrValue) {
...
}
И так далее для других типов, каждый из которых использует метод преобразования, определенный и оптимизированный для этого типа. Любой тип, который не соответствует ни одному из этих специализированных шаблонов, вернется к стандартному stringstream
метод.
Несколько моментов:
чтобы точно измерить, получить моментальный снимок, вызвать функцию в цикле для X раз (скажем, X = 10000), а затем снова получить время (см. clock()
). Вычтите начальное время из конечного и разделите на X.
Это даст вам точное измерение.
ostringstream не предназначен для производительности, он предназначен для равномерного расширяемого буферизованного вывода (buffered = slow).
Вы должны конкретизировать шаблон по типу и использовать более быстрые альтернативы. Если возможно, не переключайтесь на sprintf, но используйте другие альтернативы (например, выделите строку напрямую и т. Д.).
Если вы используете sprintf, будьте параноиком по этому поводу (проверьте возвращаемое значение, угловые случаи и т. Д.).