Оптимизация поиска самой широкой строки в массиве строк? - PullRequest
2 голосов
/ 09 января 2011

Прямо сейчас у меня есть массив std :: strings, и у меня есть функция в моем шрифте, чтобы определить его ширину.

 for(std::vector<std::pair<std::string,bool>>::const_iterator it = items.begin();
  it != items.end(); ++it)
 {
  cSz = getFont().getTextWidth(it->first);
  if( cSz > h)
  {
   h = cSz;
  }
 }
 widestItem = h;

Мне было интересно, мог ли я пропустить лучший способделайте это, потому что это очень грубый способ найти его.

В моей ситуации не было бы особого смысла хранить ширину каждого и ссылаться на это.

Спасибо

Ответы [ 2 ]

3 голосов
/ 09 января 2011

Если бы я оптимизировал это, я бы:

  1. Обязательно используйте профилировщик, чтобы узнать, что именно здесь происходит значительное время.

  2. Возможно, есть кеш (шрифт, строка) кортежей. Если вы неоднократно вычисляете ширину одних и тех же строк, это поможет. Но это зависит от вашего конкретного случая использования.

  3. Вы можете сделать свой метод getTextWidth очень быстрым в обычном случае - вы можете иметь плоский массив из 256 единиц ширины текста, и просто разыменовывать и суммировать для каждого латинского символа 1, который у вас есть. Это будет достаточно быстро, чтобы вы не увидели время, потраченное на современный процессор. Конечно, вам все еще нужно реализовать нелатинские символы, и вы можете или не хотите делать кернинг, лигатуры и сложную разметку текста (вот где этот материал может стать дорогим).

2 голосов
/ 09 января 2011

Если длина строки важна, вы можете сохранить ее длину при добавлении строки в вектор, таким образом вам не нужно будет каждый раз вычислять ее (вы можете использовать std :: tuple из 3 элементов вместо std :: pair, если у вас есть доступ к C ++ 0x). Если вы часто меняете шрифты, это может не подойти. Или вы можете сохранить длину и пересчитать длину при смене шрифтов, если вектор не содержит миллионы элементов.

Оптимизация трудна, когда у нас мало информации о структуре программного обеспечения и о том, что вы делаете, кроме этого небольшого фрагмента.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...