Programming Taskbook 0
Download 1.62 Mb. Pdf ko'rish
|
Abramyan-Pascal2016-1
200000000 1638
Время меньше, чем для варианта 1. Следует, однако, учитывать, что в варианте 2 выделяется память для хранения всех элементов. Время, требу- емое на размещение в памяти массива и его преобразование, компенсиру- ется ускорением при его обработке в цикле foreach, поскольку теперь про- грамма не генерирует элементы исходной последовательности «на лету», а просто читает их значения, размещенные в памяти. Модифицируем последний вариант, заменив цикл foreach на цикл for: // Вариант 3 var a := ArrFill(100000000, 1); for var i := 0 to a.Length - 1 do a[i] := a[i] * 2; var sum := 0; for var i := 0 to a.Length - 1 do sum += a[i]; Print(sum, Milliseconds); Теперь результаты программы будут следующими: 200000000 1648 Таким образом, скорость работы вариантов 2 и 3 совпадает. Вернемся к варианту 1. При работе с последовательностями надо ак- тивно использовать запросы, поскольку именно они позволяют выполнять обработку последовательностей наиболее эффективным образом. В нашем случае для суммирования элементов последовательности следовало ис- пользовать не цикл, а специальный запрос Sum: // Вариант 4 var a := SeqFill(100000000, 1).Select(e -> 2 * e); var sum := a.Sum; Print(sum, Milliseconds); Теперь программа выведет следующие данные: 200000000 1347 Мы получили наилучшее быстродействие из всех рассмотренных ва- риантов. Заметим, что запрос Sum можно было применить непосредствен- но к результату, возвращенному запросом Select, сформировав цепочку за- просов (это стандартный способ обработки последовательностей): // Вариант 4a var sum := SeqFill(100000000, 1).Select(e -> 2* e).Sum; Print(sum, Milliseconds); |
Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling
ma'muriyatiga murojaat qiling