Время измерения нагрузки класса с служебный метод


Когда я загрузить новый класс я измерить время, которое требуется для установки, инициализации и загрузки этого класса, это помогает мне отлаживать время, затрачиваемое на выполнение действий в пределах своего приложения.

Вот у меня есть очень хорошая функция, которая делает все это для меня.

public static T CreateInstanceOf<T>() where T : new()
{
    var stopwatch = Stopwatch.StartNew();
    var result = new T();

    stopwatch.Stop();
    Logger.Trace("Loaded " + result.GetType().Name + " [took " + stopwatch.ElapsedMilliseconds + "ms]");

    return result;
}

Она также имеет очень простое использование, как так..

ConfigHandler = CoreUtilities.CreateInstanceOf<ConfigHandler>();

Но проблемы возникают, когда я хочу загрузить класс. Теперь можно сказать, что я мог бы поставить это в конструкторе и у меня выше измерения методом времени способ занимает, а также начало класс, но как C# и заявил, конструкторы не для вызова методов.

А я хочу, чтобы измерить время effiently, я тоже не хочу нарушать языковые правила, которых рекомендуется придерживаться, кто-нибудь знает обойти.

Вот все, что я делаю, чтобы загрузить классы, простой способ.

ConfigHandler.Load("resources/config/server.config.json");

Я мог бы просто добавить секундомер между каждыми 2 линии все, что я инициализировать, но давайте быть честными, кто хочет это сделать, особенно когда у вас есть всего 30 занятий, чтобы начать в вашем проекте.



114
-1
задан 25 января 2018 в 01:01 Источник Поделиться
Комментарии
1 ответ

Создать делегат, который может быть выполнен после инициализации класса.

public static T CreateInstanceOf<T>(Action<T> configure = null) where T : new() {
var stopwatch = Stopwatch.StartNew();

var result = new T();

if(configure != null) {
configure(result);
}

stopwatch.Stop();
Logger.Trace("Loaded " + result.GetType().Name + " [took " + stopwatch.ElapsedMilliseconds + "ms]");

return result;
}

и использовать

var handler = CoreUtilities.CreateInstanceOf<ConfigHandler>(_ => 
_.Load("resources/config/server.config.json")
);

Наличие дополнительного параметра означает, что ваш оригинальный вариант использования применяется

CoreUtilities.CreateInstanceOf<ConfigHandler>(); //parameter defaults to null

Номер для возможных улучшений, такие как асинхронные перегрузки, а также

public static async Task<T> CreateInstanceOfAsync<T>(Func<T, Task> configure = null) where T : new() {
var stopwatch = Stopwatch.StartNew();

var result = await Task.Run(() => return new T());
if(configure != null) {
await configure(result);
}

stopwatch.Stop();
Logger.Trace("Loaded " + result.GetType().Name + " [took " + stopwatch.ElapsedMilliseconds + "ms]");

return result;
}

используется как

var handler = await CoreUtilities.CreateInstanceOf<ConfigHandler>(_ => 
_.LoadAsync("resources/config/server.config.json") //Assuming LoadAsync returns Task
);

2
ответ дан 25 января 2018 в 01:01 Источник Поделиться