Информация об изменениях

Сообщение Re[39]: Есть ли подобие LINQ на других языках/платформах? от 24.04.2021 11:55

Изменено 24.04.2021 13:04 Serginio1

Re[39]: Есть ли подобие LINQ на других языках/платформах?
Здравствуйте, Ikemefula, Вы писали:


I>То есть, если ты сотню раз будешь использовать источник такого вида

I>
I>while(true) {
I>  yield i++;
I>}
I>

I>То ты сэкономишь кучу памяти, но при этом работа с источником окажется примерно в 1000 раз медленнее.
I>И для оптимизации используется кеширование коллекции.

Специально сделал тест
class Program
    {
        static long InlineCalk()
        {
            long result = 0;
            for (int i = 0; i < int.MaxValue; i++)
                result += i;

            return result;

        }

        static IEnumerable GetEnumerable()
        {
            for (int i = 0; i < int.MaxValue; i++)
                yield return i;
        }

        static long YieldCalk()
        {
            long result = 0;
            foreach (int i in GetEnumerable())
                result += i;

            return result;

        }
        static void Main(string[] args)
        {
            var r = DateTime.Now;

            InlineCalk();
            var res = (DateTime.Now - r).TotalMilliseconds;
            Console.WriteLine(res);
            r = DateTime.Now;
            YieldCalk();
            var res2 = (DateTime.Now - r).TotalMilliseconds;
            Console.WriteLine(res2);
            Console.WriteLine($"отношение yield к inline {res2 / res}");
            Console.ReadLine();
        }
    }


1385,5371
25225,436
отношение yield к inline 18,206250846693315

То есть ты ошибся как минимум раз в 50!
И это на result += i; Если будут функции с поиском в хэштаблице и ли функции работы со строками,
а учитывая, что в реалии нужно обращаться к данным, которые могут находиться вне кэша памяти,то это отношение будет стремиться к 1!!
То есть ни о каких 1000 и близко нет, но вот если тебе понадобится коллекция то ты на памяти больше потеряешь.
А что мне кэшировать если
1. Данные меняются
2. Мне нужно один раз получить такой итератор с такими условиями.
Re[39]: Есть ли подобие LINQ на других языках/платформах?
Здравствуйте, Ikemefula, Вы писали:


I>То есть, если ты сотню раз будешь использовать источник такого вида

I>
I>while(true) {
I>  yield i++;
I>}
I>

I>То ты сэкономишь кучу памяти, но при этом работа с источником окажется примерно в 1000 раз медленнее.
I>И для оптимизации используется кеширование коллекции.

Специально сделал тест
 class Program
    {
        static long InlineCalk()
        {
            long result = 0;
            for (int i = 0; i < int.MaxValue/2; i++)
                result += i;

            return result;

        }

        static IEnumerable<int> GetEnumerable()
        {
            for (int i = 0; i < int.MaxValue/2; i++)
                yield return i;
        }

        static long YieldCalk()
        {
            long result = 0;
            foreach (int i in GetEnumerable())
                result += i;

            return result;

        }
        static void Main(string[] args)
        {
            var r = DateTime.Now;

            var result=InlineCalk();
            var res = (DateTime.Now - r).TotalMilliseconds;
            Console.WriteLine(res);
            Console.WriteLine(result);
            r = DateTime.Now;
            result=YieldCalk();
            var res2 = (DateTime.Now - r).TotalMilliseconds;
            Console.WriteLine(result);
            Console.WriteLine(res2);
            Console.WriteLine($"отношение yield к inline {res2 / res}");
            Console.ReadLine();
        }
    }


727,6487
576460750692810753
576460750692810753
6389,199
отношение yield к inline 8,780609379223794



То есть ты ошибся как минимум раз в 100! Ну какая хрен разница подумаешь! Главное медленнее. Но цифрами бросаться все же не стоит.
И это на result += i; Если будут функции с поиском в хэштаблице и ли функции работы со строками,
а учитывая, что в реалии нужно обращаться к данным, которые могут находиться вне кэша памяти, то это отношение будет стремиться к 1!!
То есть ни о каких 1000 и близко нет, но вот если тебе понадобится коллекция то ты на памяти больше потеряешь.
А что мне кэшировать если
1. Данные меняются
2. Мне нужно один раз получить такой итератор с такими условиями.

Кстати в .Net есть