Принципиальный молчун
Зарегистрирован: 10 September 2007
Сообщения: 9
Примеры кода: 0
|
Плохая производительность .NET |
24 October 2007 16:16 |
|
|
|
|
Столкнулся с таким непонятным явлением.
Создаю (на С#) одномерный массив int'ов.
Есть 2 варианта его заполнения:
а) считывание файла, где в каждой строке имеется одно число,
2) с помощью генератора случайных чисел.
Затем с этим массивом что-либо делаю,
например, сортирую, замеряя время сортировки (и только её!).
Получаю, что
в первом варианте, когда массив заполнялся из файла,
время сортировки в 20 раз (!) больше, чем когда он заполнялся
с помощью генератора ( при размере массива 50 млн. чисел).
Попробовал не сортировать, а выполнять более простую операцию,
например, находить максимум в массиве - результаты такие же:
если массив заполнялся из файла, последующая операция работает
не менее, чем в 5 раз медленнее ( на массиве из 10 млн. чисел).
Вот код нахождения максимума с использованием файла:
using System;
using System.IO;
public class Max_From_File {
public static void Main ( String[] args ) {
int i;
FileStream fs = new FileStream ( "InputData.in", FileMode.Open, FileAccess.Read );
StreamReader sr = new StreamReader ( fs );
int N = System.Convert.ToInt32 ( sr.ReadLine() );
Console.WriteLine ( "N = " + N );
int[] x = new int [ N ];
for ( i = 0; i < N; i++ )
x [ i ] = System.Convert.ToInt32 ( sr.ReadLine() );
sr.Close();
fs.Close();
DateTime dt1 = DateTime.Now;
int maxim = x [ 0 ];
for ( i = 1; i < N; i++ )
if ( x [ i ] > maxim )
maxim = x [ i ];
DateTime dt2 = DateTime.Now;
Console.WriteLine ( (dt2-dt1).TotalSeconds + " sec. ");
}
}
А вот код с использованием генератора:
using System;
using System.IO;
public class Max_Random {
public static void Main ( String[] args ) {
int i;
int N = System.Convert.ToInt32 ( args [ 0 ] );
Console.WriteLine ( "N = " + N );
int[] x = new int [ N ];
Random rand = new Random();
for ( i = 0; i < N; i++ )
x [ i ] = rand.Next();
DateTime dt1 = DateTime.Now;
int maxim = x [ 0 ];
for ( i = 1; i < N; i++ )
if ( x [ i ] > maxim )
maxim = x [ i ];
DateTime dt2 = DateTime.Now;
Console.WriteLine ( (dt2-dt1).TotalSeconds + " sec. ");
}
}
А вот результаты их запусков:
K:\Tmp\>Max_From_File
N = 10000000
0,5 sec.
K:\Tmp\>Max_Random 10000000
N = 10000000
0,078125 sec.
На списках большей длины результаты еще больше различаются.
Этот эффект проверялся на разных машинах,
в том числе, с памятью до 2Гб, - результат один и тот же ...
Использовалась .NET такая:
Microsoft (R) Visual C# 2005 Compiler version 8.00.50727.42
for Microsoft (R) Windows (R) 2005 Framework version 2.0.50727
Copyright (C) Microsoft Corporation 2001-2005. All rights reserved.
Кто сталкивался с этим эффектом?
И как его можно объяснить ?
А самое главное, как его можно избежать ?
Интересно, что под Моно (Линукс) такого эффекта нет -
там всё работает быстро:
$ mono Max_From_File.exe
N = 20000000
0.208978 sec.
$ mono Max_Random.exe 20000000
N = 20000000
0.205876 sec.
В заключение, код, котрый генерирует файл с числами:
using System;
using System.IO;
public class FileWriter {
public static void Main ( String[] args ) {
int N = 10000000;
FileStream fs = new FileStream ( "InputData.in", FileMode.Create, FileAccess.Write );
StreamWriter sw = new StreamWriter ( fs );
Random rand = new Random();
sw.WriteLine ( N );
for ( int i = 0; i < N; i++ )
sw.WriteLine ( rand.Next( 10000 ) );
sw.Close();
fs.Close();
}
}
Данное сообщение получено с сайта GotDotNet.RU
|
|