Форум программистов, компьютерный форум, киберфорум
Бета-тестирование
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.81/43: Рейтинг темы: голосов - 43, средняя оценка - 4.81
Труд вопреки насмешкам
 Аватар для Etyuhibosecyu
363 / 181 / 41
Регистрация: 13.07.2017
Сообщений: 4,845
Записей в блоге: 14

Corlib .NStar (Pre-Pre-Alpha) 0.05. Теперь отдельно от нелюбимого многими языка!

15.11.2022, 02:13. Показов 11969. Ответов 194
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Помню, кто-то писал о функциях C# .NStar примерно следующее (неточная цитата): "все это или уже есть в языке, просто вы не в курсе, или лечится подключением библиотеки или банальным написанием функции". Тогда я отреагировал на это высказывание отрицательно, но теперь подумал и решил, что новичкам, может быть, и пригодится язык с богатым фреймворком и низким порогом вхождения, но новички - очень ограниченный круг охвата, а большинству людей трудно переучиваться, поэтому неплохо было бы подключить библиотеку и не изучать новый язык. Так появился проект Corlib .NStar - новая библиотека, объединяющая BigCollections и стандартную библиотеку C# .NStar. Ее можно подключить практически к любому не эзотерическому/игрушечному языку и не слишком упрощенному конструктору, вот только желательно было бы протестировать на предмет доступности функций в неуправляемых языках - есть подозрение, что они "прячутся", хотя я навесил на них DllExport. Изменений много, подробнее читайте на нашей новой странице GitHub. Некоторые изменения из стандартной библиотеки C# .NStar в разработке, например, замена. А некоторые вряд ли когда-то будут доступны вне C# .NStar по объективным причинам, как, например, escape-последовательности \! и \q. Так что библиотека явно менее функциональна, чем полноценный язык. Но не намного. Тестируйте, дорогу осиливает идущий!
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
15.11.2022, 02:13
Ответы с готовыми решениями:

Как вытащить все данные между тегами <pre></pre>
Добрый вечер! Ребята, как получить текст с страницы? Сама страница: &lt;html&gt;&lt;head&gt;&lt;link rel=&quot;stylesheet&quot;...

Вставка тега <pre></pre> в файлы директории
Здравствуйте, форумчане! Не подскажете как можно средствами php вставить тег &lt;pre&gt;&lt;/pre&gt; во все текстовые файлы в директории...

Pre-alpha Season Unreal Tournament
Качаю последнюю версию, которая уже в разработке, потому что 3 для меня не актуальна - накувыркался с ботами с тройки достаточно, в онлайне...

194
3061 / 1463 / 265
Регистрация: 16.03.2008
Сообщений: 6,510
Записей в блоге: 2
16.11.2022, 18:07
Студворк — интернет-сервис помощи студентам
C#
1
2
3
4
5
6
7
8
9
var s = new string('a', 1000000000);
Stopwatch sw = Stopwatch.StartNew();
var a = E.Count(s);
sw.Stop();
Console.WriteLine(sw.ElapsedMilliseconds);
sw.Restart();
var b = s.Count();
sw.Stop();
Console.WriteLine(sw.ElapsedMilliseconds);
(оговорюсь - я не знаю шарп совсем)
Прежде чем сравнивать операцию вычисления длины строки и количество элементов, я бы посмотрел во внутрь. Вероятно в первом варианте, имеем неявное преобразование строки в массив объектов. Для чистоты эффекта, все же стоит в первом случае передать готовый массив объектов, во втором выполнять вашу обертку, а не встроенный метод.

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

0
Труд вопреки насмешкам
 Аватар для Etyuhibosecyu
363 / 181 / 41
Регистрация: 13.07.2017
Сообщений: 4,845
Записей в блоге: 14
16.11.2022, 18:15  [ТС]
Цитата Сообщение от voral Посмотреть сообщение
Для чистоты эффекта, все же стоит в первом случае передать готовый массив объектов
Исходно Usaga насмехался над проверками в дочернем для Count() методе. Вы это читали (#25)? Я показал всю мощь этих проверок. Он пока молчит, надеюсь, прокомментирует завтра утром. Разумеется, с готовым массивом классический метод справляется. А я показал его узкое место.
Цитата Сообщение от voral Посмотреть сообщение
во втором выполнять вашу обертку, а не встроенный метод.
Выше в том же сообщении написано, какие using в этом файле. То, что вы видите экстент - не значит, что это тот экстент, который вы привыкли видеть. Я тоже умею писать экстенты.
Цитата Сообщение от voral Посмотреть сообщение
Может вам тогда стоит пойти в разработчики шарпа
Я это делаю уже скоро как четыре года...
0
Эксперт .NET
 Аватар для Usaga
14724 / 9493 / 1362
Регистрация: 21.01.2016
Сообщений: 35,790
16.11.2022, 18:27
Цитата Сообщение от Etyuhibosecyu Посмотреть сообщение
Фильтровать можно методом самого списка FilterInPlace(). Это не LINQ, но у Microsoft его тоже нет. А благодаря тому, что предыдущий метод возвращает список, его почти всегда можно применить.
Ну так и добавили бы к списку метод-расширение, которое in place сортирует. Причём тут "OptimizedLinq"?

Цитата Сообщение от Etyuhibosecyu Посмотреть сообщение
Комплексный замер с использованием множества методов:
Что в этой каше замеряется? Тут разобрать ничего нормально не возможно.

Цитата Сообщение от Etyuhibosecyu Посмотреть сообщение
Мой метод быстрее в ПЯТЬСОТ ПЯТЬДЕСЯТ РАЗ!!!
Ваш метод просто кастит IEnumerable к строке и обращается к свойству Length. Я это в коде видел. Тут нюанс в том, что ни один дебил не будет так со строкой обращаться. Т.е. вы "оптимизировали" надуманную проблему. Оттуда и разница колосальная.

Цитата Сообщение от Etyuhibosecyu Посмотреть сообщение
На остальной поток флуда ответить нечего.
Правда? Что именно флуд? Указать можете? Я строго по делу отписался. Даже на код указал. Или если ответить нечего, то сразу "флуд"?

Цитата Сообщение от Etyuhibosecyu Посмотреть сообщение
Это только один метод, Usaga же указал на TryGetCountEasily(), а Count() напрямую его вызывает. В 500 раз быстрее потому, что у меня все сводится к нескольким проверкам, а классический LINQ делает полный перебор. Но этот случай - исключение, большинство методов на несколько процентов быстрее.
У вас там проверка на кейс, который никогда не встречается. Это натягивание совы на глобус. Я вам ПРЯМО указал, что у вас более 600 (шестиста) точек, где создаётся список из перечисления. Это трындец как накладно. Вы это всё замеряли? Есть нормальные замеры всех этих методов? В виде кода, чтобы мы тоже могли прогнать эти тесты и убедиться, что перед нами не очередной мусор, а что-то стоящее?

Добавлено через 51 секунду
Цитата Сообщение от Etyuhibosecyu Посмотреть сообщение
Исходно Usaga насмехался над проверками в дочернем для Count() методе. Вы это читали (#25)? Я показал всю мощь этих проверок.
Мощь вы показали в касте IEnumerable к string. Очень мощно, ничего не скажешь.

Добавлено через 1 минуту
Цитата Сообщение от Etyuhibosecyu Посмотреть сообщение
Я это делаю уже скоро как четыре года...
Ой, как не хочется вас расстраивать...
0
Труд вопреки насмешкам
 Аватар для Etyuhibosecyu
363 / 181 / 41
Регистрация: 13.07.2017
Сообщений: 4,845
Записей в блоге: 14
16.11.2022, 18:31  [ТС]
Цитата Сообщение от Usaga Посмотреть сообщение
Я вам ПРЯМО указал, что у вас более 600 (шестиста) точек, где создаётся список из перечисления.
0
Эксперт .NET
 Аватар для Usaga
14724 / 9493 / 1362
Регистрация: 21.01.2016
Сообщений: 35,790
16.11.2022, 18:32
Etyuhibosecyu, отлично. Почистил) Один чёрт, не многова-то ли?))
0
Труд вопреки насмешкам
 Аватар для Etyuhibosecyu
363 / 181 / 41
Регистрация: 13.07.2017
Сообщений: 4,845
Записей в блоге: 14
16.11.2022, 18:39  [ТС]
Цитата Сообщение от Usaga Посмотреть сообщение
Один чёрт, не многова-то ли?))
А вы уверены, что эта проблема не надумана, как выше пишете про мою оптимизацию? Список будет создаваться в крайне редких случаях, так как TryGetCountEasily охватывает все, что только можно...

Добавлено через 2 минуты
Usaga, на код ParallelHashSet<T> еще не смотрели? Где там тормоза? (Про чистоту лучше даже не вспоминать.)
0
Эксперт .NET
 Аватар для Usaga
14724 / 9493 / 1362
Регистрация: 21.01.2016
Сообщений: 35,790
16.11.2022, 18:49
Цитата Сообщение от Etyuhibosecyu Посмотреть сообщение
А вы уверены, что эта проблема не надумана, как выше пишете про мою оптимизацию? Список будет создаваться в крайне редких случаях, так как TryGetCountEasily охватывает все, что только можно...
Нет. Не надуманная. Я исхожу из того, что я вижу и из отсутствия замеров нормальных, которые бы доказали, что то что я вижу не правда.

Цитата Сообщение от Etyuhibosecyu Посмотреть сообщение
Usaga, на код ParallelHashSet<T> еще не смотрели? Где там тормоза? (Про чистоту лучше даже не вспоминать.)
Пропустил. Сейчас гляну.

Добавлено через 2 минуты
Глянул ваш snippet на второй странице. Два замечания:
1) вы замеряете "холодный код"
2) вы не сравниваете конечный результат

Это что сразу в глаза бросилось. Без детального разбора.
0
Труд вопреки насмешкам
 Аватар для Etyuhibosecyu
363 / 181 / 41
Регистрация: 13.07.2017
Сообщений: 4,845
Записей в блоге: 14
16.11.2022, 18:54  [ТС]
Цитата Сообщение от Usaga Посмотреть сообщение
2) вы не сравниваете конечный результат
А как же это?
Цитата Сообщение от Etyuhibosecyu Посмотреть сообщение
C#
1
Console.WriteLine(b.SetEquals(a));
Добавлено через 3 минуты
Цитата Сообщение от Etyuhibosecyu Посмотреть сообщение
А как же это?
Если вы не верите моему методу SetEquals(), то только что я запустил сравнение в обратную сторону, и оно показало то же самое!
0
3061 / 1463 / 265
Регистрация: 16.03.2008
Сообщений: 6,510
Записей в блоге: 2
16.11.2022, 20:04
Цитата Сообщение от Etyuhibosecyu Посмотреть сообщение
Я это делаю уже скоро как четыре года...
И что? Большинство языков прогрессируют и становятся лучше. Я например в институте часть кода для научного расчета переписывал на асм с паскаля и это давало ускорение расчета с нескольких суток до нескольких часов.

Потом позже я выполнил примерно такое же действие ради интереса. и справиться лучше чем это сделал компилятор у меня не получилось. И в других я зыках, что я встречал "встроенные" методы в подавляющем большинстве случаев работают быстрее. А тут вы хотите сказать, что смогли результаты команды профессиональных разработчиков улучшить с перевесом в 500 раз?

И шарпом после этого еще кто то пользуется?

Т.е. я не верю. Тут либо вы тест удобный подобрали, далекий от реальности. Либо вы сделали далекое не идентичный метод. Т.е. если его пропустить через тесты метода с которым вы соревнуетесь - наверняка он их провалит.

В то же время многие встроенные методы можно обогнать - заточив его назначение под конкретную задачу.

Вы уверены, что вы создали полный аналог?
Уверены, например, что во втором случае не выполняется какая то внутренняя оптимизация, просто потому что условия теста удачно легли?
0
Труд вопреки насмешкам
 Аватар для Etyuhibosecyu
363 / 181 / 41
Регистрация: 13.07.2017
Сообщений: 4,845
Записей в блоге: 14
16.11.2022, 23:59  [ТС]
Запустил еще такой тест:
C#
1
2
3
4
5
6
7
8
9
10
11
12
Random random = new(1234567890);
Console.WriteLine("Hello World!");
var list = OptimizedLinq.Fill(x => random.Next(0, 65536), 100000000);
Stopwatch sw = Stopwatch.StartNew();
var a = E.Average(E.Where(E.Zip(E.Skip(list, 1), E.Skip(list, 2), (x, y) => (Item1: x, Item2: y)), x => Math.Abs(x.Item1 - x.Item2) < 4096), x => Math.Abs(x.Item1 - x.Item2));
sw.Stop();
Console.WriteLine(sw.ElapsedMilliseconds);
sw.Restart();
var b = list.AsSpan(1).Combine(list.AsSpan(2), (x, y) => (Item1: x, Item2: y)).FilterInPlace(x => Math.Abs(x.Item1 - x.Item2) < 4096).Mean(x => Math.Abs(x.Item1 - x.Item2));
sw.Stop();
Console.WriteLine(sw.ElapsedMilliseconds);
Console.WriteLine(a == b);
Результат в Release уже после разогрева:
Миниатюры
Corlib .NStar (Pre-Pre-Alpha) 0.05. Теперь отдельно от нелюбимого многими языка!  
0
Эксперт .NET
 Аватар для Usaga
14724 / 9493 / 1362
Регистрация: 21.01.2016
Сообщений: 35,790
17.11.2022, 11:40
Я даже собрать это дерьмо не могу, чтобы у себя проверить "тесты") Etyuhibosecyu, Вы мастер писать хлам.
0
Труд вопреки насмешкам
 Аватар для Etyuhibosecyu
363 / 181 / 41
Регистрация: 13.07.2017
Сообщений: 4,845
Записей в блоге: 14
17.11.2022, 11:43  [ТС]
Usaga, Подключаемые usings в #34, если вы о тестах. И вы еще на ParallelHashSet<T> собирались посмотреть...
0
Эксперт .NET
 Аватар для Usaga
14724 / 9493 / 1362
Регистрация: 21.01.2016
Сообщений: 35,790
17.11.2022, 11:48
Etyuhibosecyu, вы можете выложить архив рабочего проекта с этими двумя тестами. Чтобы оно собиралось и запускалось? У меня нет желания ковырять ваш чудо-код и заставлять его работать.
0
Труд вопреки насмешкам
 Аватар для Etyuhibosecyu
363 / 181 / 41
Регистрация: 13.07.2017
Сообщений: 4,845
Записей в блоге: 14
17.11.2022, 11:52  [ТС]
Usaga, вот файл с тестами, просто раскомментируйте нужный и закомментируйте остальные.
0
Эксперт .NET
 Аватар для Usaga
14724 / 9493 / 1362
Регистрация: 21.01.2016
Сообщений: 35,790
17.11.2022, 12:02
Etyuhibosecyu, вы не поняли. Проект нужен, а не файл отдельный. Скопировать snippet мне ума хватает)
0
Труд вопреки насмешкам
 Аватар для Etyuhibosecyu
363 / 181 / 41
Регистрация: 13.07.2017
Сообщений: 4,845
Записей в блоге: 14
17.11.2022, 12:05  [ТС]
Usaga, а "Download ZIP" на GitHub не катит?
Вложения
Тип файла: zip Corlib.NStar-master.zip (372.0 Кб, 0 просмотров)
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18359 / 14289 / 5370
Регистрация: 17.03.2014
Сообщений: 28,968
Записей в блоге: 1
17.11.2022, 15:27
Etyuhibosecyu, решил замерить производительность двух таких методов
C#
1
2
3
4
5
6
7
8
9
10
11
[Benchmark]
public double Linq()
{
    return E.Average(E.Where(E.Zip(E.Skip(_list, 1), E.Skip(_list, 2), (x, y) => (Item1: x, Item2: y)), x => Math.Abs(x.Item1 - x.Item2) < 4096), x => Math.Abs(x.Item1 - x.Item2));
}
 
[Benchmark]
public double New()
{
    return _list.AsSpan(1).Combine(_list.AsSpan(2), (x, y) => (Item1: x, Item2: y)).FilterInPlace(x => Math.Abs(x.Item1 - x.Item2) < 4096).Mean(x => Math.Abs(x.Item1 - x.Item2));
}
Вот результат. Ваш код не только медленней получился т.к. он еще невообразимую кучу мусора генерирует во время работы - 2.9 Гб по сравнению с 728 байтами в обычном LINQ. Вот она цена ваших оптимизаций.
Code
1
2
3
4
| Method |    Mean |    Error |   StdDev |      Gen0 |      Gen1 |      Gen2 |    Allocated |
|------- |--------:|---------:|---------:|----------:|----------:|----------:|-------------:|
|   Linq | 2.379 s | 0.0067 s | 0.0063 s |         - |         - |         - |        728 B |
|    New | 3.981 s | 0.0194 s | 0.0182 s | 1000.0000 | 1000.0000 | 1000.0000 | 2947485984 B |
P.S. Компиляция этого "творения" была тем еще приключением кстати.
0
Труд вопреки насмешкам
 Аватар для Etyuhibosecyu
363 / 181 / 41
Регистрация: 13.07.2017
Сообщений: 4,845
Записей в блоге: 14
17.11.2022, 15:36  [ТС]
OwenGlendower, содержимое _list - тайна?
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18359 / 14289 / 5370
Регистрация: 17.03.2014
Сообщений: 28,968
Записей в блоге: 1
17.11.2022, 15:37
Цитата Сообщение от Etyuhibosecyu Посмотреть сообщение
содержимое _list - тайна?
Нет. Вот весь тест
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
using BenchmarkDotNet.Attributes;
using BenchmarkDotNet.Jobs;
using Corlib.NStar;
using E = System.Linq.Enumerable;
 
namespace Benchmark.DotNet
{
    [MemoryDiagnoser()]
    //[SimpleJob(RuntimeMoniker.Net48)]
    //[SimpleJob(RuntimeMoniker.Net60)]
    [SimpleJob(RuntimeMoniker.Net70)]
    public class B1
    {
        //private readonly Corlib.NStar.List<int> _list;
        private static readonly System.Collections.Generic.List<int> _list = CreateList();
 
        // public B1()
        // {
        //     Random random = new(1234567890);
        //     //_list = OptimizedLinq.Fill(x => random.Next(0, 65536), 10000000);
        //     _list = new System.Collections.Generic.List<int>(100_000_000);
        //     for (int i = 0; i < _list.Capacity; i++) _list.Add(random.Next(0, 65536));
        // }
 
        private static System.Collections.Generic.List<int> CreateList()
        {
            Random random = new(1234567890);
            var list = new System.Collections.Generic.List<int>(100_000_000);
            for (int i = 0; i < list.Capacity; i++) list.Add(random.Next(0, 65536));
            return list;
        }
 
        [Benchmark]
        public double Linq()
        {
            return E.Average(E.Where(E.Zip(E.Skip(_list, 1), E.Skip(_list, 2), (x, y) => (Item1: x, Item2: y)), x => Math.Abs(x.Item1 - x.Item2) < 4096), x => Math.Abs(x.Item1 - x.Item2));
        }
 
        [Benchmark]
        public double New()
        {
            return _list.AsSpan(1).Combine(_list.AsSpan(2), (x, y) => (Item1: x, Item2: y)).FilterInPlace(x => Math.Abs(x.Item1 - x.Item2) < 4096).Mean(x => Math.Abs(x.Item1 - x.Item2));
        }
    }
}
0
Труд вопреки насмешкам
 Аватар для Etyuhibosecyu
363 / 181 / 41
Регистрация: 13.07.2017
Сообщений: 4,845
Записей в блоге: 14
17.11.2022, 15:47  [ТС]
OwenGlendower, тут фишка в том, что для System.Collections.Generic.List не определен метод AsSpan(), поэтому он сначала преобразуется в Corlib.NStar.List, а так как метод вызывается два раза, то и преобразуется два раза. При использовании нужного List проблем не возникает.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
17.11.2022, 15:47

Вывести ответ сервера в <pre></pre>
Добрый день! Подскажите, пожалуйста, как мне в примере ниже сделать так, чтобы значение data выводилось не с помощью alert, а выводилось в...

Hash Function Efficiency v0.1 pre-Alpha (May 11th, 2017)
Вот код, для наглядности (cyberforum.ru - не сохраняет оригинал кода! может не компилироваться) комментарии не удалял... #include...

перенос и <pre>
столкнулся с такой проблемой - если текст выводить с помощью &lt;pre&gt; то если например текст вводился через &lt;textarea&gt; без энтэров то...

Тэг PRE
Всем привет, есть довольно таки специфический вопрос, хоть я и знаю, что к тэгу pre мало какие стили можно применить, но все - таки может...

Отличие <pre> от <p>
Скажите, в чём отличие между этими тегами?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Новые блоги и статьи
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701 Купил два термопринтера QR701. На сэлф-тесте написано: Language: PC936 (GB18030). Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
Создание формы заимствованного документа
Maks 03.08.2026
Задача: Необходимо создать собственную форму заимствованного документа. На форме должен быть реквизит "Покупатель", а также табличная часть со следующими реквизитами: - Расчетный счет покупателя. . .
Задача предоставления скидок покупателям
Maks 03.08.2026
Задача: В документе "Продажи" необходимо реализовать функционал предоставления скидок покупателям. Скидка должна автоматически рассчитываться и подставляться в соответствующее поле при выборе. . .
Почему SEO не начинается с ключевых слов: что проверить до написания текстов
Neotwalker 01.08.2026
Когда владельцу сайта предлагают заняться SEO, первым шагом часто становится сбор запросов и написание текстов. Логика кажется понятной: 1. Находим ключевые слова. 2. Добавляем их на. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru