Я пишу код для создания процедурной карты. Некоторые из этих шагов занимают гораздо больше времени, чем другие, и я определяю каждую часть сборки, чтобы увидеть, где узкие места, и сообщить пользователю, что программа не остановилась на них.Wrapper to time generic function
В настоящее время у меня есть много кода, который выглядит следующим образом:
Console.Write("Creating tiles");
var watch = System.Diagnostics.Stopwatch.StartNew();
CreateTiles(); //key mapgen function
watch.Stop();
Console.WriteLine("... finished in: {0} s", watch.ElapsedMilliseconds/1000d);
Console.Write("Calculating tile elevations");
var watch = System.Diagnostics.Stopwatch.StartNew();
CalculateTileElevations(); //key mapgen function
watch.Stop();
Console.WriteLine("... finished in: {0} s", watch.ElapsedMilliseconds/1000d);
//etc
Мой вопрос, есть ли способ рефакторинга это выглядеть больше похоже на следующее:
ExecuteTimedFunction(CreateTiles(), "Creating tiles");
ExecuteTimedFunction(CalculateTileElevations(), "Calculating tile elevations");
void ExecuteTimedFunction(Func genericFunction, String logMsg)
{
Console.Write(logMsg);
var watch = System.Diagnostics.Stopwatch.StartNew();
genericFunction();
watch.Stop();
Console.WriteLine("... finished in: {0} s", watch.ElapsedMilliseconds/1000d);
}
Предостережение: возвращаемый тип всех функций - void
, поскольку все они управляют основным списком плиток, но не все функции имеют одинаковое количество входных параметров (хотя большинство из них имеют 0 параметров, поэтому решение для этого случая будет все еще будут полезны)
Если вы измените тип «genericFunction» на «Action», он должен к. Затем вы можете называть его «ExecuteTimedFunction (CreateTiles,« Создание плит »);' – Lee