Программа для сравнения производительности необобщенного алгоритма ArrayList и обобщенного алгоритма List - C#
Формулировка задачи:
Доброе время суток!
Наткнулся я в книжке на этот код, решил проверить у себя, и получилось так, что код написан с ошибками в:
-public void Dispose() (не существует имя (m_stopwach) и пропущена запятая в GC.CollectionCount(0) m_collectionCount)
И хотел бы попросить объяснить что тут написано и почему используется Using: using (new OperationTimer("List<Int32>")). И в private static void PrepareForOperation() (я так полагаю это методы что мусор собирают)
Пытался через Ф1 найти в документации, и что то про OperationTimer ничего не нашлось.
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
public static class Program
{
public static void Main()
{
ValueTypePerfTest();
ReferenceTypePerfTest();
}
private static void ValueTypePerfTest()
{
const Int32 count = 10000000;
using (new OperationTimer("List<Int32>"))
{
List<Int32> l = new List<Int32>();
for (Int32 n = 0; n < count; n++)
{
l.Add(n); // Без упаковки
Int32 x = l[n]; // Без распаковки
}
l = null; // Для удаления в процессе уборки мусора
}
using (new OperationTimer("ArrayList of Int32"))
{
ArrayList a = new ArrayList();
for (Int32 n = 0; n < count; n++)
{
a.Add(n); // Упаковка
Int32 x = (Int32)a[n]; // Распаковка
}
a = null; // Для удаления в процессе уборки мусора
}
}
private static void ReferenceTypePerfTest()
{
const Int32 count = 10000000;
using (new OperationTimer("List<String>"))
{
List<String> l = new List<String>();
for (Int32 n = 0; n < count; n++)
{
l.Add("X"); // Копирование ссылки
String x = l[n]; // Копирование ссылки
}
l = null; // Для удаления в процессе уборки мусора
}
using (new OperationTimer("ArrayList of String"))
{
ArrayList a = new ArrayList();
for (Int32 n = 0; n < count; n++)
{
a.Add("X"); // Копирование ссылки
String x = (String)a[n]; // Проверка преобразования
} // и копирование ссылки
a = null; // Для удаления в процессе уборки мусора
}
}
}
// Класс для оценки времени выполнения операций
internal sealed class OperationTimer : IDisposable
{
private Int64 m_startTime;
private String m_text;
private Int32 m_collectionCount;
public OperationTimer(String text)
{
PrepareForOperation();
m_text = text;
m_collectionCount = GC.CollectionCount(0);
// Эта команда должна быть последней в этом методе
// для максимально точной оценки быстродействия
m_startTime = Stopwatch.StartNew();
}
public void Dispose()
{
Console.WriteLine("{0} (GCs={1,3}) {2}", [B](m_stopwatch.Elapsed)[/B],
[B]GC.CollectionCount(0) m_collectionCount[/B], m_text);
}
private static void PrepareForOperation()
{
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
}
}Решение задачи: «Программа для сравнения производительности необобщенного алгоритма ArrayList и обобщенного алгоритма List»
textual
Листинг программы
internal sealed class OperationTimer : IDisposable
{
private Stopwatch m_stopwatch;
private String m_text;
private Int32 m_collectionCount;
public OperationTimer(String text)
{
PrepareForOperation();
m_text = text;
m_collectionCount = GC.CollectionCount(0);
// Эта команда должна быть последней в этом методе
// для максимально точной оценки быстродействия
m_stopwatch = Stopwatch.StartNew();
}
public void Dispose()
{
Console.WriteLine("{0} (GCs={1,3}) {2}", m_stopwatch.Elapsed,
GC.CollectionCount(0) - m_collectionCount, m_text);
}
private static void PrepareForOperation()
{
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
}
}