Здравствуйте, nikov, Вы писали:
N>Ну вот просто удивительно. У разных языков программирования есть столько существенных преимуществ и недостатков, а люди обсуждают незначительные детали синтаксиса. Понятно же, что такие вещи являются делом привычки или личного предпочтения, их даже трудно отнести к "дизайну" языка.
Есть такая порода людей, которая свои привычки ставит выше дизайна. И их не мало.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Gattaka, Вы писали:
G>Что думаете? Есть ли основания у подобных претензий?
Если серьезно, то обсуждаешь ты полную фигню не меняющую суть языка.
Есть вещи концептуальные, а есть синтаксические различия. Вот ты обсуждаешь синтаксические мелочи.
Вот, например, концепция "все есть выражение" реально полезна. Она тоже выливается в мелкие синтаксические различия, но ее присутствие в языке позволяет рограммированть в функциональном стиле.
Если уж говорить о синтаксисе, то надо бы задаться вопросом зачем в конце функций нужно указывать return? Почему из блока нельзя вернуть значение? Почему синтаксис вызова конструктора отличается от синтаксиса вызова функции? Или почему методы расширения есть, а свойств — нет?
А точка а запятой — не более чем дань привычки. Но люди к ним привыкли и не хотят отвыкать.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Sinix, Вы писали:
S>На самом деле тут правильный подход — markdown. Rsdn, пожалуй, последний серьёзный ресурс для дотнет-разработчиков, где он всё ещё не используется.
Самое смешное, что он уже года два есть, надо только конвертер со старого формата написать. Но это задача которую даже решать не хочется, так как там придется хтмл парсить.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Gattaka, Вы писали: G>Что думаете? Есть ли основания у подобных претензий?
Мне кажется это от си пошло. В си так делали, что-бы не усложнять компилятор. Бьярн старался сделать C++ максимально совместимым с си. А яву и C# делали максимально похожим на C++, что бы было привычно.
В других языках спокойно и без скобочках обходятся и без ";" и блоки кода отступами оформляют.
Помоему чем меньше лишних символов — тем лучше.
* Так будет чуть меньше ошибок. В слове из 4 букв можно максимум 4 раза ошибиться. А в слове из 3х — только 3и.
* Меньше печатати — меньше нагрузки напальцы.
Здравствуйте, Слава, Вы писали: С>Вы помните, что такое "указатель на функцию" в Си? Вот именно такой синтакс для его получения, без скобочек.
В Си невозможно иметь несколько одноимённых методов с разными типами аргументов. Нет шаблонных методов.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, UberPsychoSvin, Вы писали:
UPS>Мне кажется это от си пошло. В си так делали, что-бы не усложнять компилятор. Бьярн старался сделать C++ максимально совместимым с си. А яву и C# делали максимально похожим на C++, что бы было привычно. UPS>В других языках спокойно и без скобочках обходятся и без ";" и блоки кода отступами оформляют.
Об ̶э̶т̶о̶ этом сломано миллиарды копий, что намекает, что такое решение как минимум спорное и неоднозначное.
UPS>Помоему чем меньше лишних символов — тем лучше. UPS>* Так будет чуть меньше ошибок. В слове из 4 букв можно максимум 4 раза ошибиться. А в слове из 3х — только 3и. UPS>* Меньше печатати — меньше нагрузки напальцы.
.. и ̶ж̶и̶в̶о̶т̶н̶о̶в̶о̶д̶с̶т̶в̶о̶ синтаксический оверхед!
Здравствуйте, Sinclair, Вы писали:
S>Здравствуйте, Слава, Вы писали: С>>Вы помните, что такое "указатель на функцию" в Си? Вот именно такой синтакс для его получения, без скобочек. S>В Си невозможно иметь несколько одноимённых методов с разными типами аргументов. Нет шаблонных методов.
Я наверное недостаточно ясно выразился. Обычный Си, не С++, какие там методы?
По памяти (я могу ошибаться):
int f(int arg){ //функция
...
}
float f(float arg){ //разве нельзя иметь еще одну f, но с другим типом аргумента?
...
}
void p(){
(int (int )) *f_ptr; //указатель на функцию (здесь и далее я могу ошибиться в синтаксисе, но суть остается)int b = f(8); //вызов функции, имя со скобочками
f_ptr = f; //взятие указателя на функцию, имя без скобочекint c = f_ptr(8); //вызов функции через указатель
}
Здравствуйте, Sinix, Вы писали:
EP>>Интересно, а почему в этот раз всё примерно вдвое быстрей? По идеи должно же быть наоборот, из-за branch misprediction. Или это другая машина? S>Опс, другая машина. Первые тесты на ноутбуке запускал, вторые — на полноценной дев-машине. Некритично, т.к. сравнивать в любом случае надо относительное время
Это понятно. Мне было интересно в том числе увидеть эффект от перетасовки, ну да ладно, не суть.
S>После того как считаем, что набрали достаточно статистики, отключаем автозаполнение, тесты начинают падать, если любой из методов не укладывается в лимиты.
Хороший подход. Ещё можно добавить нормализацию по нескольким показателям (либо взвешенной комбинации показателей) конкретной машины, типа (flops, ips, GiB/s) — тогда хоть как-то будет между машинами переноситься.
EP>>Это специально так сделано? Чтобы компилятору было проще понять что там по умолчанию? S>Неа, jit-компилятор никак не учитывает default values
Так у тебя default value это null (ещё одно ограничение C#), а Comparer уже внутри метода — это вполне может влиять на оптимизацию
S>>>Так вот, для общего случая _правильно написанный_ универсальный метод чуть быстрее. EP>>Так то с чем ты сравниваешь в CodeJam тоже универсально жеж. S>Выделил
Я понимаю. Я о том что это не относится к той кодогенерации, и их код можно заменить твоим вариантом.
S>>> В лучшем — в 10 раз быстрее за счёт правильного выбора алгоритма, см на MyMinBy. EP>>Структура алгоритма (MyMinBy vs MyMinByComparer) одинаковая, отличие только в использовании костыля Operators, и в том что он жёстко зашит в коде, а не приходит извне. S>Ну да. Operators используют ordinal-сравнение для строк, без учёта культуры, что примерно на порядок быстрее. В 99% случаев требуется именно это, когда явно нужна культура, никто не запрещает передать другой comparer.
О том и речь — чтобы заменить его в MyMinBy — придётся менять код MyMinBy, снаружи он не приходит. То есть получается сравнение универсального, против менее универсального.
S>>>В самом худшем — на 20-25% медленнее. Один подвох: рукопашный вариант в этом самом худшем случае в 8 раз быстрее. EP>>В котором даже нет селектора, не говоря уже об IEnumerable. S>А смысл оставлять всю эту радость, если для нас действительно важна производительность?
Это должно быть заботой компилятора, а не программиста, так как получить из универсального варианта конкретный (под конкретные типы) — простая механическая задача. Собственно та текстовая кодогенрация в CodeJam и есть пример частичного решения этой механической задачи.
Абстракции не обязаны быть дорогими, даже на C#.
Здравствуйте, Evgeny.Panasyuk, Вы писали:
EP>Это понятно. Мне было интересно в том числе увидеть эффект от перетасовки, ну да ладно, не суть.
Нет его. JIT достаточно умён, чтобы убрать всё, связанное с сравнением с null для структур, а для строк оно в микроскоп не заметно, всё съедает собственно сравнение.
EP>Хороший подход. Ещё можно добавить нормализацию по нескольким показателям (либо взвешенной комбинации показателей) конкретной машины, типа (flops, ips, GiB/s) — тогда хоть как-то будет между машинами переноситься.
На практике оно уже переносится, нормализация идёт относительно baseline-метода.
Проверено тестами на рабочем компе, типовых ноутбуках, полноценном билд-сервере и на Appveyor (билд-сервис, использует VM в облаке Azure).
EP>Так у тебя default value это null (ещё одно ограничение C#), а Comparer уже внутри метода — это вполне может влиять на оптимизацию
Не может. Jit в этом смысле довольно дубовый и оставляет обычный вызов интерфейса.
EP>О том и речь — чтобы заменить его в MyMinBy — придётся менять код MyMinBy, снаружи он не приходит. То есть получается сравнение универсального, против менее универсального.
Две перегрузки vs двенадцать — что же выбрать? Прям не знаю
S>>А смысл оставлять всю эту радость, если для нас действительно важна производительность? EP>Это должно быть заботой компилятора, а не программиста, так как получить из универсального варианта конкретный (под конкретные типы) — простая механическая задача.
И в третий раз — фантастика в соседнем отделе У нас реальный код с реальным рантаймом, рассуждения в стиле "за всё хорошее и против всего плохого", увы, не срабатывают
Здравствуйте, Слава, Вы писали: С>По памяти (я могу ошибаться):
С>int f(int arg){ //функция С>... С>}
С>float f(float arg){ //разве нельзя иметь еще одну f, но с другим типом аргумента? С>... С>}
Конечно же нет. Nеперь попробуйте взять адреc f. Куда он будет показывать?
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
— там два момента.
S>А, ну как и было сказано — иногда больше работы не значит лучше. Специально засёк время — 10 минут на код ушло. Блин, но оформление ответа больше потрачу, наверно S>Для структур соотношение: S>
S> Method | Median | StdDev | Scaled | Min | Lnml(min) | Lnml(max) | Max |
S>-------------- |------------ |----------- |------- |------------ |---------- |---------- |------------ |
S> MinCodeJam | 13.5474 us | 4.2560 us | 1.00 | 9.8527 us | 1.00 | 1.00 | 57.8845 us |
S> MinNaive | 133.8322 us | 37.9869 us | 9.88 | 109.2005 us | 9.78 | 9.78 | 584.1817 us |
S> MinOk | 17.6527 us | 1.5569 us | 1.30 | 13.9580 us | 1.28 | 1.28 | 25.8633 us |
S> MinOkComparer | 16.4211 us | 1.2513 us | 1.21 | 13.5474 us | 1.18 | 1.18 | 27.0949 us |
S> MinDoneRight | 1.6421 us | 0.5551 us | 0.12 | 1.2316 us | 0.12 | 0.12 | 10.2632 us |
S>
S>для строк: S>
S> Method | Median | StdDev | Scaled | Min | Lnml(min) | Lnml(max) | Max |
S>-------------- |-------------- |------------ |------- |-------------- |---------- |---------- |-------------- |
S> MinCodeJam | 331.7068 us | 19.2213 us | 1.00 | 289.4224 us | 1.00 | 1.00 | 419.9704 us |
S> MinNaive | 4,391.0101 us | 622.1757 us | 13.24 | 2,497.2433 us | 12.18 | 12.18 | 5,005.5709 us |
S> MinOk | 25.0422 us | 5.5940 us | 0.08 | 16.4211 us | 0.07 | 0.07 | 79.2320 us |
S> MinOkComparer | 313.6436 us | 38.8401 us | 0.95 | 170.3692 us | 0.94 | 0.94 | 474.9812 us |
S> MinDoneRight | 252.4749 us | 61.4753 us | 0.76 | 155.5902 us | 0.66 | 0.66 | 359.6227 us |
S>
Здравствуйте, Sinix, Вы писали:
S>Здравствуйте, Serginio1, Вы писали:
S>> Кстати можно через roslyn-linq-rewrite пропустить S>>http://rsdn.org/forum/dotnet/6572465.1
Здравствуйте, Sinix, Вы писали:
S>Здравствуйте, Serginio1, Вы писали:
S>> Кстати можно через roslyn-linq-rewrite пропустить S>>http://rsdn.org/forum/dotnet/6572465.1