Re: C++ code formatter
От: Dair Россия  
Дата: 05.10.17 10:03
Оценка: 46 (1) +3
Здравствуйте, c-smile, Вы писали:

CS>Кто что порекомендует? Или я таки еще рано беспокоюсь и такого нет в природе?


Re[2]: C++ code formatter
От: cures Россия cures.narod.ru
Дата: 05.10.17 16:31
Оценка: -4
Здравствуйте, Дрободан Фрилич, Вы писали:

ДФ>В студии Replace in Files позволяет заменить табы на пробелы


Это если предпродажная подготовка, когда уже договорились на цену за байт сорсов. А по-человечески если — нужно наоборот. Причём не все пробелы, а только в началах строк, да и то иногда не всех. Я cindent использовал, но он пробелы на табы только в начале строки не умеет, им всё в пробелы переводил, а в табы потом — своей простенькой программкой. Теперь та программка уже не нужна, в стандартных дистрибутивах expand/unexpand появились, хоть и с корявыми ключами.
Не сработает, если программа писалась упоротыми товарищами, внутри строк тоже табами егозившими для красивости. Ну и вообще если внутри строк неземные красоты наведены, при переформатировании всё накроется. Но оно и правильно, мудрые люди говорят, что так делать нельзя.
Ещё cindent не умел по-людски строки переносить, поэтому им все в одну строку делал (ширина 256, кажется), а потом сам руками. В общем, нормальное оформление программы — тоже труд, и чисто автоматически вряд ли выйдет хорошо.
Re[2]: C++ code formatter
От: c-smile Канада http://terrainformatica.com
Дата: 05.10.17 23:04
Оценка: :))) :)
Здравствуйте, Дрободан Фрилич, Вы писали:

ДФ>В студии Replace in Files позволяет заменить табы на пробелы


Я конечно профан в некоторых вопросах, но уж не настолько.
Re: C++ code formatter
От: SchweinDeBurg Россия https://zarezky.spb.ru/
Дата: 05.10.17 05:18
Оценка: 46 (1) +2
Здравствуйте, c-smile, Вы писали:

c> Кто что порекомендует? Или я таки еще рано беспокоюсь и такого нет в природе?


Artistic Style
avalon/2.0.6
- Искренне ваш, Поросенок Пафнутий
Re: C++ code formatter
От: MTD https://github.com/mtrempoltsev
Дата: 05.10.17 04:58
Оценка: 46 (1) :)
Здравствуйте, c-smile, Вы писали:

CS>Решил навести красоту в исходниках и привести их к единому формату. Оные редактировались на разных платформах, разных редакторах и соответственно разными верованиями в значение \t.


CS>Кто что порекомендует? Или я таки еще рано беспокоюсь и такого нет в природе?


Vera++ is a programmable tool for verification, analysis and transformation of C++ source code.
The main usage scenarios that are foreseen for Vera++ are:
Ensure that the source code complies with the given coding standards and conventions.
Provide source code metrics and statistics.
Perform automated transformations of the source code, which can range from pretty-printing to diagnostics to fault injection and advanced testing.


https://bitbucket.org/verateam/vera/wiki/Introduction

Или ты про spaces vs tabs? Я за 4 пробела.
Отредактировано 05.10.2017 5:00 MTD . Предыдущая версия .
Re[6]: C++ code formatter
От: c-smile Канада http://terrainformatica.com
Дата: 13.10.17 00:25
Оценка: +1 -1
Здравствуйте, uzhas, Вы писали:

U>Здравствуйте, c-smile, Вы писали:


U>>>use std::map, Luke!


CS>>Сам-то понял что сказал?


U>я предложил каскад if (по факту линейный поиск) можно заменить на поиск по мапе (тут всякие мапы можно заюзать)

U>вот так, например: https://ideone.com/oa9hv0
U>по факту это switch по строкам, который в плюсах не поддерживается =\

Ты думаешь что условно 9 if:
if(s.length = A && strcmp(...) == 0) t = 1;
else if(s.length = B && strcmp(...) == 0) t = 2;
...

будет медленнее чем создание std::map и поиск по дереву?

Если "да" то ты ошибаешься я думаю.

А для больших списков строк есть gperf который a) статический, b) быстрее чем std::map и с) памяти не просит.
Отредактировано 13.10.2017 0:29 c-smile . Предыдущая версия . Еще …
Отредактировано 13.10.2017 0:25 c-smile . Предыдущая версия .
Re[7]: C++ code formatter
От: alex_public  
Дата: 13.10.17 01:24
Оценка: -2
Здравствуйте, c-smile, Вы писали:

U>>я предложил каскад if (по факту линейный поиск) можно заменить на поиск по мапе (тут всякие мапы можно заюзать)

U>>вот так, например: https://ideone.com/oa9hv0
U>>по факту это switch по строкам, который в плюсах не поддерживается =\
CS>Ты думаешь что условно 9 if:
CS>
CS>if(s.length = A && strcmp(...) == 0) t = 1;
CS>else if(s.length = B && strcmp(...) == 0) t = 2;
CS>...
CS>

CS>будет медленнее чем создание std::map и поиск по дереву?
CS>Если "да" то ты ошибаешься я думаю.

Так это зависит от того, как используется данный код. Если он вызывается не один раз, то очевидно что std::map будет эффективнее, т.к. инициализация дерева будет происходить только один раз. И это кстати не теория — я использую на практике именно такой подход (только со string_view, а не string в качестве ключа для map).

CS>А для больших списков строк есть gperf который a) статический, b) быстрее чем std::map и с) памяти не просит.


Хы, ну это уже для совсем тяжёлых случаев игрушка. )))
Re[7]: C++ code formatter
От: MTD https://github.com/mtrempoltsev
Дата: 16.10.17 07:25
Оценка: +2
Здравствуйте, c-smile, Вы писали:

CS>Ты думаешь что условно 9 if:

CS>if(s.length = A && strcmp(...) == 0) t = 1;
CS>[/ccode]
CS>будет медленнее чем создание std::map и поиск по дереву?

Конечно if зарулит, если еще построить автомат, чтобы без strcmp, думаю, будет еще быстрее. А уж если собрать статистику, что чаще ищется и использовать чтобы минимизировать branch mispredict, то еще лучше. map здесь делает код чище, поэтому если овчинка выделки не стоит я за map (unordered_map), а в плане быстродействия вообще сравнивать смысла нет.
Re[3]: C++ code formatter
От: Dair Россия  
Дата: 12.10.17 08:53
Оценка: 23 (1)
Здравствуйте, c-smile, Вы писали:

CS>Оно и хрен бы с ним, но вот зачем "time-" "local" разделились не ясно.

CS>Хотя, нет, ясно ибо BreakStringLiterals: true было

Для clang-format'а есть какие-то специальные комменты в коде, типа "отсюда не форматировать" и "досюда не форматировать".
Re[5]: C++ code formatter
От: uzhas Ниоткуда  
Дата: 12.10.17 16:11
Оценка: +1
Здравствуйте, c-smile, Вы писали:

U>>use std::map, Luke!


CS>Сам-то понял что сказал?


я предложил каскад if (по факту линейный поиск) можно заменить на поиск по мапе (тут всякие мапы можно заюзать)
вот так, например: https://ideone.com/oa9hv0
по факту это switch по строкам, который в плюсах не поддерживается =\
C++ code formatter
От: c-smile Канада http://terrainformatica.com
Дата: 05.10.17 04:47
Оценка:
Решил навести красоту в исходниках и привести их к единому формату. Оные редактировались на разных платформах, разных редакторах и соответственно разными верованиями в значение \t.

Кто что порекомендует? Или я таки еще рано беспокоюсь и такого нет в природе?
Re[2]: C++ code formatter
От: Ops Россия  
Дата: 05.10.17 05:28
Оценка:
Здравствуйте, SchweinDeBurg, Вы писали:

SDB>Artistic Style


Я когда-то его смотрел, некоторых (интересных мне) вариантов форматирования не хватало. Вообще, тогда было ощущение, что все такого рода инструменты умеют форматировать только в стиле "Linux kernel", с небольшими вариациями.
Переубедить Вас, к сожалению, мне не удастся, поэтому сразу перейду к оскорблениям.
Re: C++ code formatter
От: LaptevVV Россия  
Дата: 05.10.17 05:37
Оценка:
CS>Решил навести красоту в исходниках и привести их к единому формату. Оные редактировались на разных платформах, разных редакторах и соответственно разными верованиями в значение \t.
CS>Кто что порекомендует? Или я таки еще рано беспокоюсь и такого нет в природе?
В CodeBlocks штук 15 стилевых форматтеров С++ кода.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re: EditorConfig
От: Qbit86 Кипр
Дата: 05.10.17 06:17
Оценка:
Здравствуйте, c-smile, Вы писали:

CS>...разными верованиями в значение \t.

CS>Кто что порекомендует?

http://editorconfig.org
Глаза у меня добрые, но рубашка — смирительная!
Re: C++ code formatter
От: SaZ  
Дата: 05.10.17 08:13
Оценка:
Здравствуйте, c-smile, Вы писали:

CS>Решил навести красоту в исходниках и привести их к единому формату. Оные редактировались на разных платформах, разных редакторах и соответственно разными верованиями в значение \t.

CS>Кто что порекомендует? Или я таки еще рано беспокоюсь и такого нет в природе?

Решарпер умеет достаточно неплохо. Единственное — ловил косяки с удалением неиспользуемых заголовочных файлов.
Re: C++ code formatter
От: Дрободан Фрилич СССР  
Дата: 05.10.17 15:22
Оценка:
c-smile:

CS>Решил навести красоту в исходниках и привести их к единому формату. Оные редактировались на разных платформах, разных редакторах и соответственно разными верованиями в значение \t.


В студии Replace in Files позволяет заменить табы на пробелы
Re[3]: C++ code formatter
От: Ops Россия  
Дата: 07.10.17 10:32
Оценка:
Здравствуйте, c-smile, Вы писали:

ДФ>>В студии Replace in Files позволяет заменить табы на пробелы


CS>Я конечно профан в некоторых вопросах, но уж не настолько.


Ты просто заблуждаешься насчет цели этого поста
Переубедить Вас, к сожалению, мне не удастся, поэтому сразу перейду к оскорблениям.
Re: C++ code formatter
От: alex_public  
Дата: 09.10.17 00:20
Оценка:
Здравствуйте, c-smile, Вы писали:

CS>Решил навести красоту в исходниках и привести их к единому формату. Оные редактировались на разных платформах, разных редакторах и соответственно разными верованиями в значение \t.

CS>Кто что порекомендует? Или я таки еще рано беспокоюсь и такого нет в природе?

Такого полно и многие известные решения уже перечислены в данной темке. Однако после появления clang format смысл во всяких сторонних дополнительных решениях полностью пропал. Ну это если мы конечно про C/C++ говорим... )
Re[2]: C++ code formatter
От: c-smile Канада http://terrainformatica.com
Дата: 12.10.17 03:17
Оценка:
Здравствуйте, alex_public, Вы писали:


_>Однако после появления clang format смысл во всяких сторонних дополнительных решениях полностью пропал.


Вот это:

fmt   =       type == WCHARS("")            ? simple_formatter 
            : type == WCHARS("text")        ? simple_formatter 
            : type == WCHARS("integer")     ? integer_formatter 
            : type == WCHARS("decimal")     ? decimal_formatter 
            : type == WCHARS("currency")    ? currency_formatter 
            : type == WCHARS("date")        ? date_formatter 
            : type == WCHARS("date-local")  ? date_local_formatter 
            : type == WCHARS("time")        ? time_formatter 
            : type == WCHARS("time-local")  ? time_local_formatter 
            : type == WCHARS("enum")        ? enum_formatter 
            : fmt = simple_formatter;


Превратилось в это вот

fmt =
            type == WCHARS("")
                ? simple_formatter
                : type == WCHARS("text")
                      ? simple_formatter
                      : type == WCHARS("integer")
                            ? integer_formatter
                            : type == WCHARS("decimal")
                                  ? decimal_formatter
                                  : type == WCHARS("currency")
                                        ? currency_formatter
                                        : type == WCHARS("date")
                                              ? date_formatter
                                              : type == WCHARS("date-local")
                                                    ? date_local_formatter
                                                    : type == WCHARS("time")
                                                          ? time_formatter
                                                          : type == WCHARS(
                                                                        "time-"
                                                                        "local")
                                                                ? time_local_formatter
                                                                : type == WCHARS(
                                                                              "enum")
                                                                      ? enum_formatter
                                                                      : fmt =
                                                                            simple_formatter;


Оно и хрен бы с ним, но вот зачем "time-" "local" разделились не ясно.

Хотя, нет, ясно ибо BreakStringLiterals: true было
Отредактировано 12.10.2017 3:24 c-smile . Предыдущая версия .
Re[3]: C++ code formatter
От: uzhas Ниоткуда  
Дата: 12.10.17 08:42
Оценка:
Здравствуйте, c-smile, Вы писали:

CS>Превратилось в это вот


use std::map, Luke!
Re[4]: C++ code formatter
От: c-smile Канада http://terrainformatica.com
Дата: 12.10.17 15:47
Оценка:
Здравствуйте, uzhas, Вы писали:

U>Здравствуйте, c-smile, Вы писали:


CS>>Превратилось в это вот


U>use std::map, Luke!


Сам-то понял что сказал?
Re[8]: C++ code formatter
От: c-smile Канада http://terrainformatica.com
Дата: 13.10.17 21:09
Оценка:
Здравствуйте, alex_public, Вы писали:


_>Так это зависит от того, как используется данный код. Если он вызывается не один раз, то очевидно что std::map будет эффективнее


Не всем настолько "очевидно" ...

А если не гадать на кофейной гуще то вот результаты теста — меньше run time — лучше:

map_resolveFormatter 0.039
if_resolveFormatter 0.025


Т.е. мой вариант не то что не хуже, а вообще в два раза быстрее.

Вот те функции что тестировались:

Твоя:
// std::map approach +++

// build formatter index
std::map<std::string, FormatterType> index = {
  { "text", simple_formatter },
  { "integer", integer_formatter },
  { "decimal", decimal_formatter },
  { "currency", currency_formatter },
  { "date", date_formatter },
  { "date-local", date_local_formatter },
  { "time", time_formatter },
  { "time-local", time_local_formatter },
  { "enum", enum_formatter }
};


FormatterType map_resolveFormatter(std::string name)
{
  auto it = index.find(name);
  return (it != index.end()) ? it->second : simple_formatter;
}
// std::map approach ---

Моя

// if approach +++
FormatterType if_resolveFormatter(std::string name)
{
  tool::chars name_chars = tool::chars(name.c_str(), name.size());
  return 
      name_chars == CHARS("text") ? simple_formatter
    : name_chars == CHARS("integer") ? integer_formatter
    : name_chars == CHARS("decimal") ? decimal_formatter
    : name_chars == CHARS("currency") ? currency_formatter
    : name_chars == CHARS("date") ? date_formatter
    : name_chars == CHARS("date-local") ? date_local_formatter
    : name_chars == CHARS("time") ? time_formatter
    : name_chars == CHARS("time-local") ? time_local_formatter
    : name_chars == CHARS("enum") ? enum_formatter 
    : simple_formatter;
}

// if approach ---


На этом вот наборе

enum { TOTAL_RUNS = 1000 };

std::string input_tokens[] = { "", "text", "integer", "decimal", "currency", "date", "date-local", "time", "time-local", "enum"  };

std::vector<std::string> input;

void generate_input() {
  for (int n = 0; n < TOTAL_RUNS; ++n)
    input.push_back(std::string(input_tokens[std::rand() % items_in(input_tokens)]));
}


Таким вот образом:

void run_test(FormatterType(*test)(std::string name), const char* name)
{
  auto start = std::chrono::steady_clock::now();
  unsigned tn = 0;
  for(int n = 0; n < TOTAL_RUNS; ++n)
    for (int i = 0; i < TOTAL_RUNS; ++i)
      tn += (unsigned)test(input[i]);
  auto finish = std::chrono::steady_clock::now();
  double elapsed_seconds = std::chrono::duration_cast<std::chrono::duration<double> >(finish - start).count();
  std::cout << name << " " << elapsed_seconds << " " << tn << std::endl;
}

int main() {
  generate_input();
  run_test(map_resolveFormatter, "map_resolveFormatter");
  run_test(if_resolveFormatter, "if_resolveFormatter");
  return 0;
}
Отредактировано 13.10.2017 21:11 c-smile . Предыдущая версия .
Re[9]: C++ code formatter
От: night beast СССР  
Дата: 14.10.17 12:19
Оценка:
Здравствуйте, c-smile, Вы писали:

CS>Не всем настолько "очевидно" ...


CS>Твоя:

CS>
CS>// std::map approach +++

CS>// build formatter index
CS>std::map<std::string, FormatterType> index = {
CS>  { "text", simple_formatter },
CS>  { "integer", integer_formatter },
CS>  { "decimal", decimal_formatter },
CS>  { "currency", currency_formatter },
CS>  { "date", date_formatter },
CS>  { "date-local", date_local_formatter },
CS>  { "time", time_formatter },
CS>  { "time-local", time_local_formatter },
CS>  { "enum", enum_formatter }
CS>};
CS>


насколько критично по производительности?
вариант с поиском в сортированном векторе/массиве не пробовал?
добавление простого хэша как ситуацию изменит?
Re[10]: C++ code formatter
От: c-smile Канада http://terrainformatica.com
Дата: 14.10.17 15:41
Оценка:
Здравствуйте, night beast, Вы писали:

NB>Здравствуйте, c-smile, Вы писали:


CS>>Не всем настолько "очевидно" ...


CS>>Твоя:

CS>>
CS>>// std::map approach +++

CS>>// build formatter index
CS>>std::map<std::string, FormatterType> index = {
CS>>  { "text", simple_formatter },
CS>>  { "integer", integer_formatter },
CS>>  { "decimal", decimal_formatter },
CS>>  { "currency", currency_formatter },
CS>>  { "date", date_formatter },
CS>>  { "date-local", date_local_formatter },
CS>>  { "time", time_formatter },
CS>>  { "time-local", time_local_formatter },
CS>>  { "enum", enum_formatter }
CS>>};
CS>>


NB>насколько критично по производительности?


В моем случае производительность всегда критична. Во всяком случае желательна.
Иначе получается Electron.

NB>вариант с поиском в сортированном векторе/массиве не пробовал?


Сортированный вектор из 8 элементов? Зачем?

NB>добавление простого хэша как ситуацию изменит?


А как это меняет дело?

Я в скрипте как-то проводил исследование — представление object в памяти:
{ foo: 1,
  bar: 2,
  zed: 3 }

Оказалось что если кол-во key/value пар меньше 7-8 то линейный поиск быстрее — меньше накладных расходов на подготовку поиска.
Поэтому если элементов больше 8 я object конвертирую в hash table.

Но это все индивидуально — зависит от того что есть ключ в конкретном случае.
Re[9]: C++ code formatter
От: alex_public  
Дата: 14.10.17 18:04
Оценка:
Здравствуйте, c-smile, Вы писали:

CS>А если не гадать на кофейной гуще то вот результаты теста — меньше run time — лучше:

CS>
CS>map_resolveFormatter 0.039
CS>if_resolveFormatter 0.025
CS>

CS>Т.е. мой вариант не то что не хуже, а вообще в два раза быстрее.

К сожалению не могу проверить данные результаты, т.к. не знаю кто такие tool::chars и т.п.

CS>Вот те функции что тестировались:

CS>Твоя:

Вообще то это не моя функция — её предложил uzhas. Я вроде как вполне однозначно написал выше, что использую немного другой вариант.
Re[10]: C++ code formatter
От: alex_public  
Дата: 14.10.17 18:32
Оценка:
Здравствуйте, night beast, Вы писали:

NB>насколько критично по производительности?

NB>вариант с поиском в сортированном векторе/массиве не пробовал?
NB>добавление простого хэша как ситуацию изменит?

Нет, там немного другой расклад — гораздо критичнее совсем другие параметры.

У варианта с map используется чуть менее медленное сравнение (отношение, а не равенство) чем в варианте с if, но при этом само количество сравнение меньше (причём принципиально — O(n) vs O(log(n)) ). Соответственно чем больше элементов в нашем списке вариантов, тем больше будет преимущество кода с map над вариантом с if.

Ну и ещё отдельно можно отметить, что нахождение среди тестируемых образцов вариантов не входящих в список определённых существенно деградирует эффективность кода с if (т.к. надо всегда проходить весь путь сравнения) и почти никак не влияет на производительность кода с map.
Re[10]: C++ code formatter
От: c-smile Канада http://terrainformatica.com
Дата: 14.10.17 19:15
Оценка:
Здравствуйте, alex_public, Вы писали:

_>Здравствуйте, c-smile, Вы писали:


CS>>А если не гадать на кофейной гуще то вот результаты теста — меньше run time — лучше:

CS>>
CS>>map_resolveFormatter 0.039
CS>>if_resolveFormatter 0.025
CS>>

CS>>Т.е. мой вариант не то что не хуже, а вообще в два раза быстрее.

_>К сожалению не могу проверить данные результаты, т.к. не знаю кто такие tool::chars и т.п.


tool::chars это пара
struct chars { 
  const char* start; 
  size_t length; 
}


Вот вариант этой конструкции https://github.com/c-smile/sciter-sdk/blob/master/include/aux-slice.h#L48

CS>>Вот те функции что тестировались:

CS>>Твоя:

_>Вообще то это не моя функция — её предложил uzhas. Я вроде как вполне однозначно написал выше, что использую немного другой вариант.


Ты как я понял используешь map string_view.
Т.е. можешь переписать мой вариант со string_view — получишь тот же результат — map медленнее.
Это если string_view::operator=() правильно написан конечно.
Re[11]: C++ code formatter
От: c-smile Канада http://terrainformatica.com
Дата: 14.10.17 19:26
Оценка:
Здравствуйте, alex_public, Вы писали:

_>Здравствуйте, night beast, Вы писали:


Это вот ты написал?

_>то очевидно что std::map будет эффективнее, т.к. инициализация дерева будет происходить только один раз. И это кстати не теория — я использую на практике именно такой подход (только со string_view, а не string в качестве ключа для map).


Если "да" то вот тебе пример когда map медленнее перебора.
Re[11]: C++ code formatter
От: Vi2 Удмуртия http://www.adem.ru
Дата: 14.10.17 19:29
Оценка:
Здравствуйте, c-smile, Вы писали:

CS>tool::chars это пара

CS>struct chars { 
CS>  const char* start; 
CS>  size_t length; 
CS>}

CS>Вот вариант этой конструкции https://github.com/c-smile/sciter-sdk/blob/master/include/aux-slice.h#L48

Похоже, что твой вариант останавливается на сравнении указателей, поэтому и ощутимо быстрее.

bool operator == ( const slice& r ) const
      {
        if( length != r.length )
          return false;
>>>        if( start == r.start )
>>>          return true;
        for( unsigned int i = 0; i < length; ++i )
          if( start[i] != r.start[i] )
            return false;
        return true;
      }
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re[12]: C++ code formatter
От: c-smile Канада http://terrainformatica.com
Дата: 14.10.17 20:24
Оценка:
Здравствуйте, Vi2, Вы писали:

Vi2>Похоже, что твой вариант останавливается на сравнении указателей, поэтому и ощутимо быстрее.


Нет, ибо

void generate_input() {
  for (int n = 0; n < TOTAL_RUNS; ++n)
    input.push_back(std::string(input_tokens[std::rand() % items_in(input_tokens)]));
}
Re[11]: C++ code formatter
От: alex_public  
Дата: 15.10.17 01:58
Оценка:
Здравствуйте, c-smile, Вы писали:

_>>К сожалению не могу проверить данные результаты, т.к. не знаю кто такие tool::chars и т.п.

CS>tool::chars это пара
CS>
CS>struct chars { 
CS>  const char* start; 
CS>  size_t length; 
CS>}
CS>

CS>Вот вариант этой конструкции https://github.com/c-smile/sciter-sdk/blob/master/include/aux-slice.h#L48

А, ну т.е. это как раз самопальный аналог string_view. )))

_>>Вообще то это не моя функция — её предложил uzhas. Я вроде как вполне однозначно написал выше, что использую немного другой вариант.

CS>Ты как я понял используешь map string_view.
CS>Т.е. можешь переписать мой вариант со string_view — получишь тот же результат — map медленнее.
CS>Это если string_view::operator=() правильно написан конечно.

Эм, оператор равенства? ) У тебя какое-то весьма странное представление об алгоритмах... Как ты себе представляешь бинарное дерево на основе оператора равенства? )))

В реальном мире std::map очевидно использует оператор сравнения (а конкретно оператор "меньше"), а не оператор равенства. Причём если не указать иного, то используется стандартный оператор "меньше" для указанного в качестве ключа типа. И как раз в этом и заключается причина медленности твоей реализации варианта с map: стандартный оператор сравнения у std::string (да и у std::string_view тоже) является лексикографическим, что абсолютно логично для строкового типа, но совершенно избыточно для ключа бинарного дерева. Однако стоит нам указать более подходящий оператор сравнения, например так:
struct my_less{bool operator()(string_view x, string_view y) const {return x.size()==y.size()?x<y:x.size()<y.size();}};
const map<string_view, FormatterType, my_less> index = {...};

как сразу же данный код с map становится быстрее твоего варианта с if'ми даже для указанного в твоём примере небольшого перечисления (для больших перечислений map будет эффективнее даже со стандартным лексикографическим оператором сравнения).
Re[12]: C++ code formatter
От: alex_public  
Дата: 15.10.17 02:01
Оценка:
Здравствуйте, c-smile, Вы писали:

CS>Это вот ты написал?

_>>то очевидно что std::map будет эффективнее, т.к. инициализация дерева будет происходить только один раз. И это кстати не теория — я использую на практике именно такой подход (только со string_view, а не string в качестве ключа для map).

Зачем задавать риторические вопросы? )

CS>Если "да" то вот тебе пример когда map медленнее перебора.


Пока что подобного примера не видел. А видел только неумение пользоваться стандартными средствами языка и как следствие этого написание самопальных велосипедов. )
Re[11]: C++ code formatter
От: night beast СССР  
Дата: 15.10.17 09:23
Оценка:
Здравствуйте, c-smile, Вы писали:

NB>>вариант с поиском в сортированном векторе/массиве не пробовал?


CS>Сортированный вектор из 8 элементов? Зачем?


бинарный поиск -- меньше сравнений.

NB>>добавление простого хэша как ситуацию изменит?


CS>А как это меняет дело?


ну, сравнить два инта проще чем строки. но накладные расходы на вычисление хэша добавляются.
Re[8]: C++ code formatter
От: alex_public  
Дата: 16.10.17 23:56
Оценка:
Здравствуйте, MTD, Вы писали:

MTD>Конечно if зарулит, если еще построить автомат, чтобы без strcmp, думаю, будет еще быстрее. А уж если собрать статистику, что чаще ищется и использовать чтобы минимизировать branch mispredict, то еще лучше. map здесь делает код чище, поэтому если овчинка выделки не стоит я за map (unordered_map), а в плане быстродействия вообще сравнивать смысла нет.


В данном конкретном случае unordered_map будет менее эффективным решением, по сравнению с просто map. )
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.