От: | Сергей Губанов | http://sergey-gubanov.livejournal.com/ | |
Дата: | 13.11.04 20:51 | ||
Оценка: | 3 (1) |
MODULE TestGC;
IMPORT StdLog, Services;
PROCEDURE f(N: INTEGER);
TYPE Objects = POINTER TO ARRAY OF Object;
Object = POINTER TO RECORD Refs: Objects END;
VAR X, a: Objects; i,j: INTEGER;
BEGIN
NEW(X, N);
FOR i := 0 TO N-1 DO NEW(X[i]) END;
FOR i := 0 TO N-1 DO
NEW(a, N);
FOR j := 0 TO N-1 DO a[j] := X[j] END;
X[i].Refs := a;
END;
END f;
PROCEDURE Main*();
CONST N = 5000;
VAR n: INTEGER; t: LONGINT;
BEGIN
StdLog.String("first memory allocation..."); f(N); StdLog.Ln();
StdLog.String("start");
t := Services.Ticks();
FOR n := 1 TO 10 DO f(N) END;
t := (Services.Ticks() - t) DIV 10;
StdLog.String("t = "); StdLog.Int(t); StdLog.String(" ms");
StdLog.Ln();
END Main;
END TestGC.
namespace TestGC
{
class Object
{
public Object[] Refs;
}
class Program
{
static void Main(string[] args)
{
const int N = 5000;
System.Console.WriteLine("first memory allocation..."); f(N);
System.Console.WriteLine("Start...");
long t = System.Environment.TickCount;
for (int i = 0; i < 10; i++) f(N);
t = (System.Environment.TickCount - t) / 10;
System.Console.WriteLine("t = {0}", t);
System.Console.ReadLine();
}
private static void f(int N)
{
Object[] X = new Object[N];
for (int i = 0; i < N; i++) X[i] = new Object();
for (int i = 0; i < N; i++)
{
Object[] a = new Object[N];
for (int j = 0; j < N; j++) a[j] = X[j];
X[i].Refs = a;
}
}
}
}
Component Pascal BlackBox 1.4 t = 1.691 сек,
C# MS Visual Studio .NET 2003 t = 6.375 сек,
Такую большую разницу я могу объяснить только тем что BlackBox только один раз взял 100 мегабайтов, а .NET то и дело захватывал по 100 мегабайтов пока вся оперативная память не исчерпывалась, а потом возвращал ее обратно повторяя все это вновь и вновь.Windows XP SP1, машина Celeron 1100 Coppermain 128Kb, DIMM 448Mb PC100.