Более быстрое преобразование в строку

Допустим, есть часть кода, которая занимает большую часть общего времени программы (~ 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

Решение

Вы можете попробовать использовать template specialization в дополнение к приведенному вами коду, для оптимизации наиболее распространенных случаев (например, vector<bool> может быть более экономичным).

Например:

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

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

И так далее для других типов, каждый из которых использует метод преобразования, определенный и оптимизированный для этого типа. Любой тип, который не соответствует ни одному из этих специализированных шаблонов, вернется к стандартному stringstream метод.

3

Другие решения

Несколько моментов:

  • чтобы точно измерить, получить моментальный снимок, вызвать функцию в цикле для X раз (скажем, X = 10000), а затем снова получить время (см. clock()). Вычтите начальное время из конечного и разделите на X.

    Это даст вам точное измерение.

  • ostringstream не предназначен для производительности, он предназначен для равномерного расширяемого буферизованного вывода (buffered = slow).

    Вы должны конкретизировать шаблон по типу и использовать более быстрые альтернативы. Если возможно, не переключайтесь на sprintf, но используйте другие альтернативы (например, выделите строку напрямую и т. Д.).

    Если вы используете sprintf, будьте параноиком по этому поводу (проверьте возвращаемое значение, угловые случаи и т. Д.).

3

По вопросам рекламы [email protected]