на char* очень удобно парсить текст, тут он предпочтительней и даст большой прирост скорости/экономии памяти, если же речь идет о простых динамических строках - без разницы, если хранить вместе с char* и размер строки+буфера, если не хранить - то на таких строках еще и проседание получить можно
Если strlen() хотпойнтом не является, то абсолютно фиолетово.
Но вообще имеет смысл использовать stl::string чисто из соображений удосбтва. А если работа с текстом является критичной к производительности, имеет смысл разработать собственную структуру данных, оптимизирвоанную под задачу. Например, если стоит задача быстр-быстро конкатенировать много строк, то возможно решением окажется завернуть всю работу в класс, который физически строки не конкатенирует, а строит вектор из чанков.
Ты и так можешь переопределить аллокатор, чтобы он использовал хоть файлы на удаленном ресурсе, но сильно ли именно статические буферы увеличат скорость? reserve() выделит заранее память в куче и не будет ничего выделять, пока хватит места.
Если так заботит производительность, можно наваять свой стринг (или как то искорежить stl-ный) на общем кольцевом буфере. Если конечно известна оценка сверху для строки, она относительно невелика, код не параллельный и тд. Если код параллельный - под каждую нить нужен будет свой буфер.
Быстрее сделать в принципе невозможно;-)
Ну и буфера в куче, при запуске выделяются, при завершении освобождаются.
Если все упирается тока в эту ф-ю, то м.б. передавать результат не по значению а по ссылке? Сделаете один раз строку и будете ее юзать всю дорогу. Только надо посмотреть как оператор += в std::string реализован, ИМНО все же быстрее (и правильней) в данном слуае работать через gpioStr = '0'
ты упоролся. зачем тебе здесь строки? битовые маски отменили? или хотя бы задай начальный размер строки равным GPIO_MASK_LIMIT. Я так понял, у тебя эмулятор микроконтроллера какого-то, значит памятью можно пожертвовать ради производительности, тем более что GPIO регистров явно немного и они небольшие
быстрее сделать gpioStr.push_back( '1' ), ну и в данном случае очевидно быстрее всего будет сохранять результат в char[] на стеке, который будет передан параметром в функцию
void SampleProcessor::ComputeGpioVal(unsigned int gpioVal, string& gpioStr)
{
unsigned int i;
i = 1 << (sizeof(gpioVal) * 8 - 1);
gpioStr.clear();
gpioStr.reserve(5);
while (i > GPIO_MASK_LIMIT)
{
if (gpioVal & i)
gpioStr += "1";
else
gpioStr += "0";
i >>= 1;
}
}
получил уменьшение общего времени выполнения этой ф-и с 35% до 21%. А также malloc() улетел вниз по количеству вызовов и соответсвенно потреблению ресурсов.
Ты сравниваешь разные штуки в плане интерфейса. char * - это не строки, а массив символов, который по соглашению имеют \0 для обозначения конца «строки». Все остальное - как сделаешь. std::string полноценный тип для представления строк, с соответствующими операциями. С char * все будет зависеть от тебя, но если у тебя не простая последовательная обработка текста, а «классическая» работа со строками, то вряд ли у тебя получится что-либо сильно быстрее std::string.
что-то у тебя не так, если функция не зависит от значения gpioVal или?
дальнейшие попытки оптимизировать предпринимать не уяснив этот момент сложно, потому что в случае если тебе нужен sizeof(unsigned int) у будет тебя фиксированный массив 32 байта и тебе собсна string может быть и не нужен.
Зачем тебе здесь класс строки вообще в цикле? Выделяй chat s[sizeof(чего-то там) + 1] на стеке и пиши в него при помощи s[j] = (какое-то условие) ? '1' : '0';
Смотрю ещё раз и до меня доходит что ты делаешь что-то совершенно ненужное.
Эту функцию надо разделить на две:
1) отрубает у твоего числа log(GPIO_MASK_LIMIT) бит
2) общая функция преобразующая число в строку(а лучше массив символов) содержащую двоичное число.
Чувак, const char даёт тебе возможность рулить памятью в ручную, на уровне указателей. Благодаря этому у тебя намного больше места для манёвров, чем для спп строк даже со своим кастомным аллокатором. Так что когда строки - узкое место в производительности у тебя нет другого выбора кроме как перейти на const char и пытаться замутить какой-то хитрый алгоритм который в одном случае (из которого проблемы) работает быстрее, а во всех остальных - медленее.
А то, что ты просил в посте выше похоже на
запили мне такое на с++
python -m SimpleHTTPServer
и естественно вариант на с++ ты не получишь, но это не будет означать, что питон быстрее чем с++.
наркоманы ITT пугаются и прячутся, когда им указывают, что в const char строку не поместишь (ну разве только пустую), окай - убегай дальше от реальности
с точки зрения ресурсоемкости нужно писать на С. потом наступит переломный момент и ты перестанешь надрачивать на мнимые оптимизации в виде c-style строк, избегания алгоритмов из stl и коллекций оттуда же.