| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > оптимизировать код |
| Автор: ИванМ 15.4.2010, 23:52 | ||
Есть такой код. На входе число в формате xxxEyyy, на выходе xxx000..... Как его можно оптимизировать?
|
| Автор: djamshud 16.4.2010, 00:06 |
| Число или все же строка? Или в коде строка только потому, что не можете с числом? |
| Автор: ИванМ 16.4.2010, 00:07 |
| djamshud, строка. Число нельзя потому что может быть любая размерность. |
| Автор: djamshud 16.4.2010, 00:20 | ||
Вроде бы std::string позволяет работать напрямую с char*-данными. Тогда еще и strlen заменится на оптимальный str.length(). |
| Автор: jonie 16.4.2010, 00:21 | ||||
не, ну если просто заменять то зачем парсить в int n что-то? банальный алгоритм какой-то такой:
UPD: кстати:
|
| Автор: ИванМ 16.4.2010, 00:22 |
| djamshud, а нельзя C++ средствами? Не люблю я Си. |
| Автор: jonie 16.4.2010, 00:23 |
| djamshud, не факт что можно делать memcpy в возращенный указатель, т.е. надо почитать, не возращает ли он константный указатель, а-то малоли как там внутри stl сделано...(возможно в некоторых реализациях вам будут давать например копию буфера, надо читать) |
| Автор: djamshud 16.4.2010, 00:26 |
| ИванМ, а я не умею stl. Но тот пример можно пропатчить на предмет std::string и он будет наверное крайне оптимальным. Добавлено через 1 минуту и 19 секунд jonie, если в std::string есть способ получить возможность работы напряму с внутренним буфером, то проблем не будет, т.к. изменения его размеров не происходит. |
| Автор: jonie 16.4.2010, 00:34 |
| djamshud, прочти еще разок что я написал, в частности про теневую копию, а еще бывает copy-on-write и вы можете своей записью по указателю заколбасить заодно и ссылаемые строки... в общем ябы почитал что можно, а что низя ... |
| Автор: djamshud 16.4.2010, 00:42 |
| jonie, я внимательно читал, не сыпьте терминами. А сейчас прочитал описание этой строки, там предусмотрен доступ только для чтения (char const*). С ним работать опасно. |
| Автор: mes 16.4.2010, 00:43 | ||
решение в лоб, чтоб долго не думать :
|
| Автор: jonie 16.4.2010, 00:48 |
| djamshud, эт не термины - эт реальная жизнь. Для тех кто не вкурсе что такое copy-on-write это методика, когда например вы делаете копию строки, но реально буфер остается тот же самый, а вы по сути получаете пустышку, с буфером указывающим на буфер другой строки + для каждой ссылаемой сущьности проставляется признак "есть ссылка". Когда вы начинаете что-то менять в строке, тог проверяется этот признак, и, если он установлен, то производится создание нового буфера, копирование в него старого и изменение уже его (нового). Типа "копирование при записи". Эффективно экономит память, добавляет сложности при программировании, сложности отладки при перезаписи чужих данных, зачастую скорость падает... |
| Автор: mes 16.4.2010, 00:50 | ||
подправляю :
|
| Автор: jonie 16.4.2010, 00:53 | ||||||||
ИванМ, у меня не код, а псевдокод.
|
| Автор: mes 16.4.2010, 00:56 | ||
ну так |
| Автор: djamshud 16.4.2010, 00:56 |
| jonie, я сейчас матом буду ругаться. Повторяю, я думал в std::string есть char*-доступ. Посмотрел API, узнал, что только char const*, признал, что был не прав. Вы, судя по всему зная этот API, вместо того, чтобы показать на него, начали и продолжаете сыпать терминами. Уймитесь наконец. И да, в std::string есть C-o-W, но само по себе это не означает, что не может быть предоставлен прямой доступ к данным. Важно, что нет интерфейса получения этого доступа. |
| Автор: ИванМ 16.4.2010, 00:58 | ||||
| Пример работы программы: replace_e("1e4") -> "10000" replace_e("12e2") -> "1200" Вы видимо меня не поняли.
тогда так перепишу:
Добавлено через 57 секунд mes, прастите. Плохо сформулировал задачу. |
| Автор: mes 16.4.2010, 01:02 |
передача параметра через константную ссылку поможет избавить от лишнего копирования.. сейчас вначале копируется исходная строка, а потом заменяется.. |
| Автор: jonie 16.4.2010, 01:04 | ||||||
если вам нужна скорость, то вот это
.... в общем подумать можно и еще, но поздно. ЗЫ: подумайте насчет передачи строки в функцию по ссылке, если у вас не c++0x, то копирования избежите... UPD: mes опередил) UPD2:
UPD3: делайте void resize ( size_t n, char c ); вот и пропал append ... |
| Автор: ИванМ 16.4.2010, 01:19 | ||
Почему? Разве resize изменяет физический объем буфера? На счет константной ссылки согласен.
Скорость хорошо, но пользоваться сишной библиотекой не хочу категорически. |
| Автор: W4FhLF 16.4.2010, 05:22 |
| Я правильно понял, что строку в которой представлено число в формате exponential надо перевести в строку в которой представлено число в формате fixed? |
| Автор: jonie 16.4.2010, 07:35 | ||
ИванМ, boost::lexical_cast<int> .... W4FhLF, да, как потом выяснилось именно это и хотел автор |
| Автор: ИванМ 16.4.2010, 15:47 | ||
Почти. Может быть только такой вид: xxxEyyy. xxxE+yyy и xxxE-yyy не допускается. Нельзя, числа могут быть неограниченной размерности |
| Автор: W4FhLF 16.4.2010, 16:35 | ||
n тут представляет количество нулей грубо говоря. Ты же сам юзаешь такую же конструкцию:
Если будет переполнение int'a (при количестве нулей больше 0x7FFFFFFF), то оно будет и в твоём случае (я что-то сомневаюсь, что ты будешь хранит строки по 2.5 гига хранить на число.). Но boost::lexical_cast более лаконичный и быстрый способ. |
| Автор: ИванМ 16.4.2010, 16:38 | ||
W4FhLF, не так понял, прошу прощения. Я думал, мне предлагают исходное число перевести. А так да, воспользуюсь lexical_cast, если он быстрее.
Вот уже код сократился в несколько раз) |
| Автор: ИванМ 16.4.2010, 20:06 |
| Если больше нечего предложить, тему закрываю. Всем спасибо. |