Сообщение Re[39]: Есть ли подобие LINQ на других языках/платформах? от 24.04.2021 11:55
Изменено 24.04.2021 13:04 Serginio1
Re[39]: Есть ли подобие LINQ на других языках/платформах?
Здравствуйте, Ikemefula, Вы писали:
I>То есть, если ты сотню раз будешь использовать источник такого вида
I>
I>То ты сэкономишь кучу памяти, но при этом работа с источником окажется примерно в 1000 раз медленнее.
I>И для оптимизации используется кеширование коллекции.
Специально сделал тест
1385,5371
25225,436
отношение yield к inline 18,206250846693315
То есть ты ошибся как минимум раз в 50!
И это на result += i; Если будут функции с поиском в хэштаблице и ли функции работы со строками,
а учитывая, что в реалии нужно обращаться к данным, которые могут находиться вне кэша памяти,то это отношение будет стремиться к 1!!
То есть ни о каких 1000 и близко нет, но вот если тебе понадобится коллекция то ты на памяти больше потеряешь.
А что мне кэшировать если
1. Данные меняются
2. Мне нужно один раз получить такой итератор с такими условиями.
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>То ты сэкономишь кучу памяти, но при этом работа с источником окажется примерно в 1000 раз медленнее.
I>И для оптимизации используется кеширование коллекции.
Специально сделал тест
727,6487
576460750692810753
576460750692810753
6389,199
отношение yield к inline 8,780609379223794
То есть ты ошибся как минимум раз в 100! Ну какая хрен разница подумаешь! Главное медленнее. Но цифрами бросаться все же не стоит.
И это на result += i; Если будут функции с поиском в хэштаблице и ли функции работы со строками,
а учитывая, что в реалии нужно обращаться к данным, которые могут находиться вне кэша памяти, то это отношение будет стремиться к 1!!
То есть ни о каких 1000 и близко нет, но вот если тебе понадобится коллекция то ты на памяти больше потеряешь.
А что мне кэшировать если
1. Данные меняются
2. Мне нужно один раз получить такой итератор с такими условиями.
Кстати в .Net есть
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 есть