Список общих Методов Оптимизации C++ [закрывается]

Ниже код работал для меня ::

export const contactUsRoutes: Routes = [
    {
        path: 'contact-us/.', component: ContactUsComponent
    }
];

. .

Contact us

И добавьте приведенный ниже код в main.ts:

import { Location } from '@angular/common';

const __stripTrailingSlash = (Location as any).stripTrailingSlash;
(Location as any).stripTrailingSlash = function _stripTrailingSlash(url: string): string {
  const queryString$ = url.match(/([^?]*)?(.*)/);
  if (queryString$[2].length > 0) {
    return /[^\/]\/$/.test(queryString$[1]) ? queryString$[1] + '.' + queryString$[2] : __stripTrailingSlash(url);
  }
  return /[^\/]\/$/.test(url) ? url + '.' : __stripTrailingSlash(url);
};

Я указал ниже ссылку для этого решения:

https: / /stackblitz.com/github/ssatz/Angular5-Preserve-Trailing-Slash

22
задан Bhargav Rao 22 August 2018 в 19:17
поделиться

14 ответов

Два способа записать лучшие программы:

лучше всего Используют язык

  1. Код, Завершенный Steve McConnell
  2. Эффективный C++
  3. , Исключительный C++

представляет Ваше приложение

  1. , Определяют то, что берут области кода, сколько времени
  2. Видят, можно ли использовать лучшие структуры данных / алгоритмы для создания вещей быстрее

нет большого количества языка определенной оптимизации, которую можно сделать - это ограничено использованием конструкций языка (извлеките уроки из № 1). Основное преимущество прибывает из № 2 выше.

17
ответ дан 29 November 2019 в 03:26
поделиться

Вот является пара выгоды всеми путями для оптимизации.

нет никакого один путь к проблемам оптимизации... они всегда - рука, настроенная на hardware/software/system-considerations.

<час>

Принятие Вас имеют лучший алгоритм:

  1. компиляция с "выставочным выводом блока" и "самой высокой оптимизацией"
  2. смотрит на вывод блока
  3. , определяют неэффективность, которая разрушает компиляторную оптимизацию или плохо кэширование
  4. Перекод отрывок
  5. , если это - все еще плохой цикл назад к 2.
  6. сделанный

Пример, замеченный здесь: , Что самый быстрый путь состоит в том, чтобы подкачать значения в C?

<час>

Общие советы:

http://www.ceet.niu.edu/faculty/kuo/exp/exp6/figuree6-1.jpg :

  • Попытка они в плавающей точке сначала
  • Попытка они в фиксированной точке, второй
  • , Если Вы являетесь действительно разрозненными и имеете много времени и денег, попробуйте их в блоке

http://www.asc.edu/seminars/optimization/fig1.gif :

  • Проверка, если это - память ИЛИ ввод-вывод ИЛИ зависящий от ЦП
  • Нападение, которое когда-либо является ограничивающим фактором
<час>
0
ответ дан 29 November 2019 в 03:26
поделиться

Лучшая оптимизация, которую можно получить, путем пересматривания дизайна, и после профилирования производительности соответствующие части/алгоритмы приложения. Это обычно - не конкретный язык.

то, Что я имею в виду, (так же, как идея), если Вы получили бы 30%-е повышение производительности путем выбора немного лучшего алгоритма (или набор/контейнерный класс) улучшение, можно ожидать от связанного с C++ рефакторинга, были бы самое большее 2%. Улучшение дизайна могло дать Вам что-либо выше 30%.

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

0
ответ дан 29 November 2019 в 03:26
поделиться

Извините у меня нет ссылок для Вас, но у меня действительно есть другая история для добавления к груде.

у меня был довольно большой станд.:: карта, что я генерировал объект CString Microsoft использования как ключ. Производительность была недопустима. Так как все мои строки были идентичны в длине, я создал обертку класса вокруг старомодного массива фиксированного размера символов, для эмуляции интерфейса CString. К сожалению, я не могу помнить точное ускорение, но это было значительно, и получающаяся производительность была более, чем соответствующей.

Иногда необходимо знать немного о конструкциях библиотеки, на которые Вы полагаетесь.

1
ответ дан 29 November 2019 в 03:26
поделиться
  1. Профиль Ваш код для нахождения, что на самом деле занимает большую часть времени
  2. , Удостоверяется, что Вы используете правильный алгоритм
  3. при выполнении большого перемалывания чисел, быть дружественными по отношению к кэшу и попытаться сделать все возможное на блоке данных внезапно, таким образом, это не должно много раз загружаться в кэш.
1
ответ дан 29 November 2019 в 03:26
поделиться

++ p обычно быстрее, чем p ++ и - p быстрее, чем p - специально для объектов типов с перегруженным префиксом и постфиксным инкрементом и операторами понижения, потому что форма префикса просто увеличивает или постепенно уменьшает что-то и возвращает новое значение, тогда как постфиксные инкременты формы или постепенно уменьшают что-то, но должен сохранить старое значение где-нибудь для возврата его. Таким образом, вместо (заменяют интервал Вашим любимым классом здесь)

for ( int i ( 0); i < x; i++)

всегда запись

for ( int i ( 0); i < x; ++i)
2
ответ дан 29 November 2019 в 03:26
поделиться

Большая часть оптимизации является агностиком языка. Поймите свой код и поймите аппаратные средства, на которых Вы работаете, и можно сделать большую часть оптимизации низкого уровня.

Понимают Вашу проблемную область и подходящие алгоритмы, и можно сделать любую высокоуровневую оптимизацию.

единственный C ++-specific совет оптимизации, о котором я могу думать, "понимают то, что означает Ваш код". Поймите, когда C++ копирует временные файлы вокруг, поймите, каких конструкторов и деструкторы вызывают когда.

И предпочитают функторы указателям функции, поскольку первый может быть встроен компилятором. В целом переместитесь как можно больше во время компиляции, а не время выполнения. Используйте шаблоны, чтобы сделать тяжелый подъем.

И конечно, не пытайтесь оптимизировать, пока Вы не представили и шрифт что 1) оптимизация необходима и 2) , что оптимизация потребностей.

Редактирование : комментарий, который спрашивают о функторах по сравнению со встраиваемыми указателями функции. Вот объяснение:

Функции обычно компилируются в изоляции. Таким образом, что компилятор знает о функции F, который берет FP указателя функции в качестве аргумента? Ничто, это должно пойти посмотреть, откуда F называют, и , возможно там это может найти определенную подсказку, относительно которой функциональный FP указывает на. , Если это может решить, что при вызове отсюда FP будет ВСЕГДА точка для функционирования G, тогда да, это может сделать встроенную версию F, с G встроенной в нем, для этого конкретного сайта вызова. Но это не может просто встроить G, не встраивая F, потому что F можно было бы назвать от других мест также, куда это передается другой указатель функции. И даже тогда, это требует, чтобы некоторая дорогая глобальная оптимизация решила, что что-либо может быть встроено.

Предполагают, что Вы передаете функтор, такой как это вместо этого:

struct Ftor {
  void operator()() { ... }
};

так функция F похож на это:

void F(const FTor& ft) {
  ...
  ft();
  ...
}

теперь компилятор знает exacty, какая функция вызвана: Строка 2 в вызовах функции Ftor:: оператор (). И таким образом, вызов может быть встроен легко.

, Конечно, на практике, Вы обычно обрабатывали бы его по шаблону, таким образом, функция может быть вызвана с любым типом функтора:

template <typename F>
void F(const F& ft) {
  ...
  ft();
  ...
}
1
ответ дан 29 November 2019 в 03:26
поделиться

Вы попросили сайты/источники, содержащие мудрость оптимизации.

Некоторые хорошие были предложены.

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

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

ДОБАВИЛ:

Это верно, что "неправильный алгоритм" может уничтожить производительность, но это - конечно, не единственный путь.

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

, Что походит, невинные вызовы метода остроты абстрактных объектов заставляют Вас забывать то, чего тот вызов мог стоить Вам. Умножьте эту тенденцию по нескольким слоям абстракции, и Вы находите вещи как, например, проводя все Ваше время, выделяя и собирая вещи как итераторы и классы набора, когда простые массивы с индексацией были бы достаточными (и не менее удобными в сопровождении), но менее "надлежащими".

Это - проблема с "общими знаниями". Это часто - точно противоположность мудрости.

2
ответ дан 29 November 2019 в 03:26
поделиться

Распространено в других технических дисциплинах присвоить бюджеты компонентам системы. Например, механизмы самолета VTOL разработаны для обеспечения определенного количества лифта, таким образом, вес должен быть в пределе. На высоком уровне каждой части самолета дают часть бюджета веса, который это должно выполнить.

причина это недооценено вершина, вместо того, чтобы ожидать, пока она не слишком чрезмерно увеличена в размере для выхода из деки и затем взвешивающий каждую часть и регистрирующий немного прочь самого тяжелого бита, происходит частично из-за стоимости изменения изготовленных компонентов. Но значительная часть его - то, что при создании системы, где все немногим выше бюджета везде, Вы не можете только зафиксировать его в одном месте.

классический пример программного обеспечения инди Irix 5.1 SGI, которая частично является, почему у графических интенсивных пользователей есть машины Macs и Windows теперь, а не поля SGI.

"то, Что является самым пугающим о 5,1 производительности, - то, что никто не знает точно, куда она пошла. Если Вы начинаете расспрашивать тут и там, Вы получаете много взаимных упреков и теорий, но немногих фактов. В майском отчете я предложил "5%-ю теорию", которая указывает, что каждая небольшая вещь, которую мы добавляем (Мотив, интернационализация, перетаскивание, DSOs, несколько шрифтов, и так далее) стоит примерно 5% машины. После 15 или 20 из них, большей части производительности не стало".

Часто в обсуждениях производительности, 5%, как, говорят, незначителен, и совет состоит в том, чтобы ожидать, пока нет проблема, и затем ищите единственное узкое место. Для большой системы, ожидая, пока у Вас нет проблемы, может просто потерять Вас Ваш основной бизнес.

3
ответ дан 29 November 2019 в 03:26
поделиться

У меня нет сайта первое, что пришло на ум, но книга "Исключительный C++" Sutter превосходна для разработки C/C++. Я настоятельно рекомендую, чтобы каждый программист на C++ прочитал эту книгу, поскольку она подает большое понимание к не только оптимизация, но и умное использование языка так, чтобы Вы программировали действительно исключительный.

4
ответ дан 29 November 2019 в 03:26
поделиться

Вуаль Agner сделала отличную работу, анализируя вывод нескольких компиляторов относительно конструкций C++. Вы найдете его работу здесь: http://www.agner.org/optimize/ .

Intel предлагает большой документ также - "IntelВ® 64 и Справочник Оптимизации Архитектуры IA-32", который Вы найдете в http://www.intel.com/products/processor/manuals/index.htm . Хотя это главным образом предназначается для архитектуры IA-32, это содержит общие рекомендации, которые могут быть применены на большинство платформ. Очевидно, это и руководство Вуали Agner действительно пересекается немного.

, Как упомянуто в других ответах, микрооптимизация является, очевидно, последним шагом, который Вы хотите, берут для создания программы быстрее, после выбора алгоритма и профилирования.

9
ответ дан 29 November 2019 в 03:26
поделиться

Не забывайте о немногих вещах:
- "Мы должны забыть о маленькой эффективности, сказать приблизительно 97% времени: преждевременная оптимизация является корнем всего зла". (c) Donald Knuth
- Мы могли добраться больше, если мы оптимизируем алгоритмы, чем код.
- Мы оптимизируем только медленные части существующий код, который будет обнаружен профилировщиком или другим специальным инструментом.

12
ответ дан 29 November 2019 в 03:26
поделиться

Я повторю то, что сказали другие: лучший алгоритм собирается победить с точки зрения увеличения производительности.

Тем не менее я работаю в обработке изображений, которая как проблемная область может быть более липкой. Например, много лет назад у меня был блок кода, который был похож на это:

void FlipBuffer(unsigned char *start, unsigned char *end)
{
    unsigned char temp;

    while (start <= end) {
        temp = _bitRev[*start];
        *start++ = _bitRev[*end];
        *end-- = temp;
    }
 }

, который поворачивает 1-разрядный кадровый буфер 180 градусов. _bitRev является 256-байтовой таблицей обратных битов. Этот код почти так труден, как можно получить его. Это работало на 8 МГц 68K контроллер лазерного принтера и заняло примерно 2,5 секунды для легального размерного листка бумаги. Для экономии Вас детали клиент не мог перенести 2,5 секунды. Решением был идентичный алгоритм к этому. Различие было то, что

  1. я использовал 128K таблицу и воздействовал на слова вместо байтов (68K намного более счастлив на словах)
  2. , я использовал устройство Вареного пудинга для разворачивания цикла так, как будет соответствовать в рамках короткого ответвления
  3. , я вставил оптимизацию для пропуска пустых слов
  4. , я наконец переписал его в блоке для использования в своих интересах sobgtr инструкции (вычтите один и ответвление по большему), и имейте "свободный" инкремент сообщения и преддекременты в правильных местах.

Так 5x: никакое изменение алгоритма.

Дело в том, что также необходимо понять проблемную область и что означают узкие места. В обработке изображений алгоритм является все еще королем, но если Ваши циклы делают дополнительную работу, умножают ту работу на несколько миллионов, и это - цена, которую Вы платите.

24
ответ дан 29 November 2019 в 03:26
поделиться

Большинство методов компилятор - конкретно, поскольку различные компиляторы оптимизируют по-другому.

, Если Вы хотите некоторые подсказки по оптимизации, которые являются агностиком компилятора, вот два для Вас:

  1. не делают этого.
  2. (для экспертов только!): еще не делайте этого.

(извинения Michael A. Jackson )

2
ответ дан 29 November 2019 в 03:26
поделиться