Здравствуйте, Cynic, Вы писали: C>Мне нужно просто перебрать диапазон и для каждого элемента, что-то сделать не возвращая значения. foreach и for чего то поднадоели.
C>Мне нужно просто перебрать диапазон и для каждого элемента, что-то сделать не возвращая значения. foreach и for чего то поднадоели. Плохая идея. Совсем плохая.
Ну кстати я заметил, что Foreach намного быстрее Enumerable.Range для маленьких массивов, и намного медленнее для больших. Причём если выполняться тесты для Enumerable.Range несколько раз подряд (в цикле), то уже первый раз перебор занимает например 6000 тиков, а второй и последующие уже например 10. С чем это связано?
Здравствуйте, Cynic, Вы писали:
S>>Плохая идея. Совсем плохая.
C>Ну кстати я заметил, что Foreach намного быстрее Enumerable.Range для маленьких массивов, и намного медленнее для больших.
Что-то вы не то меряете. Особенно если оценки в тиках (и это не усреднённое время на паре миллионов итераций) — слишком легко померять jit/gc вместо вашего кода.
Самое прикольное, что идея плоха не из-за производительности. Проблема в злоупотреблении фишками языка.
Здравствуйте, Sinix, Вы писали:
S>Что-то вы не то меряете. Особенно если оценки в тиках (и это не усреднённое время на паре миллионов итераций) — слишком легко померять jit/gc вместо вашего кода.
Ну мерил так:
class Program
{
static void Main(string[] args)
{
int[] size = { 10, 100, 1000, 10000, 100000, 1000000}; // Размеры массивов для которых будут выполняться тестыconst int iterationCount = 100; // Количество замеров для каждого из размеров массива
Console.WriteLine("Iteration count: {0}\n", iterationCount);
while (true)
{
for (int n = 0; n < size.Length; n++)
{
int[] array = new int[size[n]];
List<int> list = new List<int>(new int[size[n]]);
Console.WriteLine("Elements count: {0}", size[n]);
// ---=== Тесты ===---
ForeachInt(array, iterationCount);
EnumerableRangeInt(array, iterationCount);
Console.WriteLine();
}
Console.WriteLine("---=== Press any key to repeat test ===---\n");
Console.ReadKey();
}
}
// foreach - int[]static void ForeachInt(int[] array, int iterationCount)
{
double overallTicks = 0;
for (int n = 0; n < iterationCount; n++)
{
int incrementor = 0;
var sw = Stopwatch.StartNew();
foreach (int value in array)
{
incrementor++;
}
sw.Stop();
overallTicks += sw.ElapsedTicks;
}
Console.WriteLine("foreach - int[] : {0}", overallTicks / iterationCount);
}
// Enumerable.Range - int[]static void EnumerableRangeInt(int[] array, int iterationCount)
{
double overallTicks = 0;
for (int n = 0; n < iterationCount; n++)
{
int incrementor = 0;
var sw = Stopwatch.StartNew();
Enumerable.Range(0, array.Length).Select(x => incrementor++);
sw.Stop();
overallTicks += sw.ElapsedTicks;
}
Console.WriteLine("Enumerable - int[] : {0}", overallTicks / iterationCount);
}
}
Хотел померить кто быстрее в переборе, т.е. доступ к элементам массива не мерил.
Здравствуйте, Cynic, Вы писали:
C>Enumerable.Range(0, array.Length).Select(x => incrementor++); C>Хотел померить кто быстрее в переборе, т.е. доступ к элементам массива не мерил.
А где перебор то? Перебор это Enumerable.Range(0, array.Length).Select(x => incrementor++).Last();
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Здравствуйте, Cynic, Вы писали:
C>Подскажите есть ли замена для Enumerable.Range.Select но без возвращаемого значения? C>...Мне нужно просто перебрать диапазон и для каждого элемента, что-то сделать не возвращая значения. foreach и for чего то поднадоели.
Попробуй бар. Ну, где женщины водятся и выпить чего есть.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.