Что значит ref int? Ссылка на инт? А зачем? Мы хотим произвольную точность для целых чисел, дробных, рациональных и комплексных. Как предлагаете сделать по-другому?
у меня нет пакетов netstandard2.0, только .Net Framework
netstandard2.0 поддерживает почти все рантаймы, и даже многие древние версии фреймворка. Рекомендую обновить рантайм, если у вас все-таки настолько древний, что netstandard2.0 не поддерживает. Ну и поставить новую VS с новым Розлином
Linq.Expression скомпилится в тот же делегат, что тут тестить? Оно транслируется в тот же IL, который, в свою очередь, транслируется тем же JIT-ом. Так что оверхед нулевой.
Кстати, посмотрите еще внимательнее — в статье в таблице есть пример, в котором в выражении нет идентичных поддеревьев. И там одинаковая производительность.
Да, JIT не может такие вещи делать. А мы можем. В математике все детерминировано, и мы этим пользуемся. Я не вижу смысла тестировать вашу лямбду, потому что надеюсь, что мы друг друга поняли. Ваша лямбда скомпилится в ту же, что и у меня.
Поддеревьев, как я уже сказал. В начале я упомянул, что выражение — это дерево. Соотвественно, мы можем запоминать значение каждого уникального поддерева, а если мы уже какое-то встречали — подставлять вместо него переменную, в которую мы его записали.
Просто с такой цифрой и без кода результаты тестов вызывают сомнения в самих тестах.
Код тестов я тоже предоставил, посмотрите пожалуйста еще раз.
Эквивалентен. Я не ограничиваю JIT в кешировании поддеревьев, захочет — сделает. Пока не делает — его проблема, которая не должна волновать пользователя.
У меня такое ощущение, что Хабр — это какой-то двуликий зверь.
С одной стороны, здесь есть и попсовые статьи, и политика, и новости, и истории из жизни. С другой стороны, тут есть огромные и сложные лонгриды, больше похожие на научные публикации — и на них тоже находится аудитория!
Кажется, что должно быть два совершенно разных туториала к этим двум вещам. В первом случае от автора требуется интересный хорошо читаемый материал. Во втором — точность выражения и хорошее знание темы. Да и аудитория разная.
Конечно, можно. В библиотеке, о которой идет речь, есть
Entity expr = "1 + 2";
// вычисляет с произвольной наперед заданной точностью
var num = expr.EvalNumerical();
// вычисляет булево значение (если выражение логическое)
var bo = expr.EvalBoolean();
Только это не AST, а полноценное дерево математических выражений. Если хотите, больше всего информации о проекте можно найти на сайте.
А тут, конечно, все сделано только ради производительности.
Это статическая генерация. По сути то же самое, что написать функцию прямо в коде. Только синтаксис чуть более красивый, и все.
Во-вторых, сорс-генераторы генерят C#-код, который потом компилится по сути в то же дерево, что и в статье. То есть это некий шаг назад. Я сразу в Linq.Expression компилю, и не заставляю никого парсить код.
Честно говоря, статья совсем чайниковая. Разбиение выражения на поддеревья, целый параграф, не скрытый в спойлеры, о том, что такие диффуры, а так же называть y' = f(x) дифференциальным уравнением (как назвать x^2 = 16 квадратным уравнением) это конечно такое себе.
I agree to an extent, but to me this is a microoptimization and too little trust in your programmer :). Also, that's what the difference looks like in VS:
Можно. В статье все есть.
Можно, конечно, сколько угодно жаловаться на РКН и его некомпетентность… но что-то Твиттер и Facebook вообще не блещут честностью и уважением законов.
Думаю, в моем случае пока все нормально, так как есть целый ряд требований к примитивам, которые отлично выполняются тем, что есть :)
Что значит ref int? Ссылка на инт? А зачем? Мы хотим произвольную точность для целых чисел, дробных, рациональных и комплексных. Как предлагаете сделать по-другому?
Попробуйте новую VS, там должен быть новый Розлин, чтобы все эти фичи реализовать. А про каст — ну может там и должен быть явный, я не помню).
Ну вы можете добавить ее через ее определение. Для интеграла нужно будет расширять протокол самим.
netstandard2.0 поддерживает почти все рантаймы, и даже многие древние версии фреймворка. Рекомендую обновить рантайм, если у вас все-таки настолько древний, что netstandard2.0 не поддерживает. Ну и поставить новую VS с новым Розлином
Linq.Expression скомпилится в тот же делегат, что тут тестить? Оно транслируется в тот же IL, который, в свою очередь, транслируется тем же JIT-ом. Так что оверхед нулевой.
Кстати, посмотрите еще внимательнее — в статье в таблице есть пример, в котором в выражении нет идентичных поддеревьев. И там одинаковая производительность.
Да, JIT не может такие вещи делать. А мы можем. В математике все детерминировано, и мы этим пользуемся. Я не вижу смысла тестировать вашу лямбду, потому что надеюсь, что мы друг друга поняли. Ваша лямбда скомпилится в ту же, что и у меня.
Поддеревьев, как я уже сказал. В начале я упомянул, что выражение — это дерево. Соотвественно, мы можем запоминать значение каждого уникального поддерева, а если мы уже какое-то встречали — подставлять вместо него переменную, в которую мы его записали.
Код тестов я тоже предоставил, посмотрите пожалуйста еще раз.
Эквивалентен. Я не ограничиваю JIT в кешировании поддеревьев, захочет — сделает. Пока не делает — его проблема, которая не должна волновать пользователя.
Но подожди, остальные три из четырех, получается, имеют ненужный софт у себя на пк?
Кешируем одинаковые поддеревья
У меня такое ощущение, что Хабр — это какой-то двуликий зверь.
С одной стороны, здесь есть и попсовые статьи, и политика, и новости, и истории из жизни. С другой стороны, тут есть огромные и сложные лонгриды, больше похожие на научные публикации — и на них тоже находится аудитория!
Кажется, что должно быть два совершенно разных туториала к этим двум вещам. В первом случае от автора требуется интересный хорошо читаемый материал. Во втором — точность выражения и хорошее знание темы. Да и аудитория разная.
Конечно, можно. В библиотеке, о которой идет речь, есть
Только это не AST, а полноценное дерево математических выражений. Если хотите, больше всего информации о проекте можно найти на сайте.
А тут, конечно, все сделано только ради производительности.
Это статическая генерация. По сути то же самое, что написать функцию прямо в коде. Только синтаксис чуть более красивый, и все.
Во-вторых, сорс-генераторы генерят C#-код, который потом компилится по сути в то же дерево, что и в статье. То есть это некий шаг назад. Я сразу в Linq.Expression компилю, и не заставляю никого парсить код.
Я постарался раписать достаточно подробно и понятно, но не знаю, получилось ли. Если нужно добавить информацию про что-то, добавлю.
Ну и конечно открыт вашему фидбеку и гениальным идеям.
Честно говоря, статья совсем чайниковая. Разбиение выражения на поддеревья, целый параграф, не скрытый в спойлеры, о том, что такие диффуры, а так же называть y' = f(x) дифференциальным уравнением (как назвать x^2 = 16 квадратным уравнением) это конечно такое себе.
Вот оно что. Я предположил, что они планово сбросили. А у них там юзеры получали доступ к аккаунтам. Еще одна фобия
I agree to an extent, but to me this is a microoptimization and too little trust in your programmer :). Also, that's what the difference looks like in VS: