Здравствуйте, Sinclair, Вы писали:
VD>>Производительность имеет значение, так что вариант на класса/лямбдах/дополнительных функциях/использующий лишние проверки не принимается (не приветствуется). S>А это уже другой вопрос. После того, как написан понятный код, в котором сложно сделать ошибку, можно заняться оптимизацией. S>С тем, чтобы получить ассемблерный выхлоп как можно ближе к тому, который ты привёл. Пусть этим преобразованием занимается платформа или фреймворк.
А если ни платформа, ни фреймворк этого делать не умеют, а нужно прямо сейчас?
Если нам не помогут, то мы тоже никого не пощадим.
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, Sinclair, Вы писали:
S>>Я бы предложил такой вариант, который понятен.
VD>Для начала твой вариант не верен. Вот исходный вариант, который переписывался: VD>
Так что там на счет правильности (эквивалентности) кода c goto?
Здравствуйте, IT, Вы писали: IT>А если ни платформа, ни фреймворк этого делать не умеют, а нужно прямо сейчас?
Я бы всё равно начал с такого кода. А потом уже профайлером смотрел, насколько там всё плохо.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, VladD2, Вы писали:
VD>Для начала твой вариант не верен. Вот исходный вариант, который переписывался:
прости, я немерле не умею. В чём ошибка-то?
Кстати, немерлёвый вариант тоже копец как непонятен. VD>Я уже писал, что производительность важна. По этому варианты с замыканиями, созданием объектов и списками не катят принципиально.
Ну, тут идея-то в том, чтобы спрятать goto под капот, где ему и место. Т.е. описывать сравнение я предлагаю в терминах составного ключа, а генерировать код — как раз такой, как ты написал (с goto).
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, fddima, Вы писали:
F>Здравствуйте, artelk, Вы писали:
A>>>или найдите компилятор который умеет инлайнить функции A>>MethodImplOptions.AggressiveInlining F> Спасибо, больше и человеческое!
Здравствуйте, VladD2, Вы писали:
S>>Я бы предложил такой вариант, который понятен.
VD>Для начала твой вариант не верен. Вот исходный вариант, который переписывался:
Как я понимаю этот каскад фильтров ищет покрывающие-всех отрезки из множества. При этом, если окажется несколько, они должны быть одинаковы.
Вариант с goto, возможно, короче и понятнее. Но он не быстрый, так как излишне часто создает (new) эти промежуточные отрезки. Создание объекта на порядки тяжелее чем целочисленное сравнение. Почему создается отрезок (RecoveryResult), если проще и быстрее сохранить текущие целочисленные минимумы и максимумы отдельно?
В общем очень много вопросов к самой реализации алгоритма, который надо еще угадать по обфусцированному коду, оптимизацией назвать это чудо трудновато.
Сперва стоит написать что должен делать алгоритм, а после можно повоевать над реализациями этого алгоритма.
ps. Вспомнил тему из форума бд с зиг, в котором он(а) пытался(ась) напрячь остальных посетителей угадать структуру бд и оптимизировать этот запрос.
Здравствуйте, Философ, Вы писали:
Ф>надо только не забыть, что 4.5 ставится только на висту, а XP ещё больше трети машин
Это я в курсе. Просто на C# — с ручным! инлайнингом довелось наиграться, а этот ключик 4.5 фреймворка — пропустил.
Здравствуйте, Sinclair, Вы писали:
IT>>А если ни платформа, ни фреймворк этого делать не умеют, а нужно прямо сейчас? S>Я бы всё равно начал с такого кода. А потом уже профайлером смотрел, насколько там всё плохо.
Честно говоря, мне вообще не очень понятен масштаб трагедии, поэтому не могу сказать как бы сам поступил
Если нам не помогут, то мы тоже никого не пощадим.
Здравствуйте, Sinclair, Вы писали:
S>прости, я немерле не умею. В чём ошибка-то?
Немерл там особо не причем. Там проверка на минимум и на максимум. И с учетом приоритетов. Когда мы фильтруем списки последовательно, то этим достигается отслеживание приоритета. Ну, а функция фильтрации определяет какой выбор мы делаем.
S>Кстати, немерлёвый вариант тоже копец как непонятен.
А ты вчитайся. Лично я его написал за пару сикунд. Оно очевиден. А вот с реализацией на ифах я накосячил (тут этот косяк несколько раз повторили).
S>Ну, тут идея-то в том, чтобы спрятать goto под капот, где ему и место. Т.е. описывать сравнение я предлагаю в терминах составного ключа, а генерировать код — как раз такой, как ты написал (с goto).
Дык я же тебе говорю, что я за 5 минут написал вариант на списках и проверил его. Это и была оптимизация. И как это часто бывает, я в ней накосячил. Вольфхаунд поправил мою реализацию с использованием готу. Я переписал его код на ифах и понял, что получилось не сильно лучше (если не хуже). Вот и решил по обсуждать этот странный, на мой взгляд, феномен.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
VD>А ты вчитайся. Лично я его написал за пару сикунд. Оно очевиден. А вот с реализацией на ифах я накосячил (тут этот косяк несколько раз повторили).
Угу. А чего там не использовано решение уравнения Больцано-Вейерштрасса заодно? Многословное изложение, основная цель которого — запутать читателя. Я верю, что ты написал его за пару секунд. А вот читать его нужно минимум несколько минут, чтобы понять суть происходящего.
VD>Дык я же тебе говорю, что я за 5 минут написал вариант на списках и проверил его. Это и была оптимизация. И как это часто бывает, я в ней накосячил. Вольфхаунд поправил мою реализацию с использованием готу. Я переписал его код на ифах и понял, что получилось не сильно лучше (если не хуже). Вот и решил по обсуждать этот странный, на мой взгляд, феномен.
Хуже. Потому что у нас нет "тройного" if-оператора, а блок схема алгортма сравнения по композитному ключу использует по три выхода из каждого блока.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
VD>Нашелся прикльный примерчик где использование goto выглядит как минимум не хуже альтернативного варианта.
VD>Вопросов два: VD>1. Какой вариант вам нравится больше? VD>2. Можно предложить какой-то другой варинат который был бы лучше чем два предложенных?
VD>Производительность имеет значение, так что вариант на класса/лямбдах/дополнительных функциях/использующий лишние проверки не принимается (не приветствуется).
VD>Вариант с goto: VD>
VD>void AddResult(int startPos, int endPos, int startState, int stackLevel, RecoveryStackFrame stackFrame, string text, int fail)
VD>{
VD> _bestResultsCount++;
VD> if (_bestResult == null) goto good;
VD> if (endPos > _bestResult.EndPos) goto good;
VD> if (endPos < _bestResult.EndPos) return;
VD> if (startPos < _bestResult.StartPos) goto good;
VD> if (startPos > _bestResult.StartPos) return;
VD> if (stackLevel < _bestResult.StackLevel) goto good;
VD> if (stackLevel > _bestResult.StackLevel) return;
VD> if (startState < _bestResult.StartState) goto good;
VD> return;
VD>good:
VD> _bestResult = new RecoveryResult(startPos, endPos, startState, stackLevel, stackFrame, text, fail);
VD>
VD>}
VD>Вариант без goto: VD>
VD>void AddResult(int startPos, int endPos, int startState, int stackLevel, RecoveryStackFrame stackFrame, string text, int fail)
VD>{
VD> _bestResultsCount++;
VD> if (this._bestResult != null)
VD> {
VD> if (endPos <= this._bestResult.EndPos)
VD> {
VD> if (endPos < this._bestResult.EndPos)
VD> return;
VD> if (startPos >= this._bestResult.StartPos)
VD> {
VD> if (startPos > this._bestResult.StartPos)
VD> return;
VD> if (stackLevel >= this._bestResult.StackLevel)
VD> {
VD> if (stackLevel > this._bestResult.StackLevel)
VD> return;
VD> if (startState >= this._bestResult.StartState)
VD> return;
VD> }
VD> }
VD> }
VD> }
VD> _bestResult = new RecoveryResult(startPos, endPos, startState, stackLevel, stackFrame, text, fail);
VD>}
VD>