我需要找到一个瓶颈,并且需要准确地测量时间.
以下代码段是衡量性能的最佳方法吗?
DateTime startTime = DateTime.Now;
// Some execution process
DateTime endTime = DateTime.Now;
TimeSpan totalTimeTaken = endTime.Subtract(startTime);
Run Code Online (Sandbox Code Playgroud) 查看某些内容(例如方法调用)接受代码的最精确方式是什么?
我猜的最容易和最快的是:
DateTime start = DateTime.Now;
{
// Do some work
}
TimeSpan timeItTook = DateTime.Now - start;
Run Code Online (Sandbox Code Playgroud)
但这有多精确?还有更好的方法吗?
经常这样我发现自己对小块代码进行基准测试,看看哪个实现最快.
我经常看到基准测试代码没有考虑到jitting或垃圾收集器的评论.
我有以下简单的基准测试功能,我已经慢慢演变了:
static void Profile(string description, int iterations, Action func) {
// warm up
func();
// clean up
GC.Collect();
var watch = new Stopwatch();
watch.Start();
for (int i = 0; i < iterations; i++) {
func();
}
watch.Stop();
Console.Write(description);
Console.WriteLine(" Time Elapsed {0} ms", watch.ElapsedMilliseconds);
}
Run Code Online (Sandbox Code Playgroud)
用法:
Profile("a descriptions", how_many_iterations_to_run, () =>
{
// ... code being profiled
});
Run Code Online (Sandbox Code Playgroud)
这个实现是否有任何缺陷?是否足以表明实现X比Z迭代实现Y更快?您能想出任何可以改善这种情况的方法吗?
编辑 很明显,基于时间的方法(与迭代相反)是首选,是否有人有任何实施时间检查不会影响性能?
我想知道程序/功能/订单需要多长时间才能完成测试.
这是我做的,但我的方法是错误的'因为如果秒的差异为0则无法返回经过的毫秒:
请注意,睡眠值为500毫秒,因此经过的秒数为0,则无法返回毫秒数.
Dim Execution_Start As System.DateTime = System.DateTime.Now
Threading.Thread.Sleep(500)
Dim Execution_End As System.DateTime = System.DateTime.Now
MsgBox(String.Format("H:{0} M:{1} S:{2} MS:{3}", _
DateDiff(DateInterval.Hour, Execution_Start, Execution_End), _
DateDiff(DateInterval.Minute, Execution_Start, Execution_End), _
DateDiff(DateInterval.Second, Execution_Start, Execution_End), _
DateDiff(DateInterval.Second, Execution_Start, Execution_End) * 60))
Run Code Online (Sandbox Code Playgroud)
有人能告诉我更好的方法吗?也许有一个TimeSpan?
解决方案:
Dim Execution_Start As New Stopwatch
Execution_Start.Start()
Threading.Thread.Sleep(500)
MessageBox.Show("H:" & Execution_Start.Elapsed.Hours & vbNewLine & _
"M:" & Execution_Start.Elapsed.Minutes & vbNewLine & _
"S:" & Execution_Start.Elapsed.Seconds & vbNewLine & _
"MS:" & Execution_Start.Elapsed.Milliseconds & vbNewLine, _
"Code execution time", MessageBoxButtons.OK, …Run Code Online (Sandbox Code Playgroud) 我知道它DateTime.UtcNow没有相对较高的精度(10-15 ms分辨率).
这对我来说是一个问题,因为在我的日志文件中,我想要更好的解决方案来解决竞争条件.
问题是:如何以比DateTime.UtcNow提供的更精确的方式获得当前日期/时间?
到目前为止,我见过的唯一解决方案是:https://stackoverflow.com/a/15008836/270348.这是解决问题的合适方法吗?
由于在.NET中没有不区分大小写string.Contains()的情况(但是string.Equals()存在一个不区分大小写的版本让我感到困惑,但我离题了),使用RegEx.IsMatch()与使用之间的性能差异是什么String.ToUpper().Contains()?
例:
string testString = "tHiSISaSTRINGwiThInconSISteNTcaPITaLIZATion";
bool containsString = RegEx.IsMatch(testString, "string", RegexOptions.IgnoreCase);
bool containsStringRegEx = testString.ToUpper().Contains("STRING");
Run Code Online (Sandbox Code Playgroud)
我一直听说这string.ToUpper()是一个非常昂贵的电话,所以当我想进行string.Contains()比较时,我不愿意使用它,但RegEx.IsMatch()在性能方面如何比较呢?
是否有更有效的方法进行此类比较?
当我想知道哪个更快时,我正在创建和翻译一些算法。
A)(int)float
或者
b)Mathf.FloorToInt(float)
提前致谢。
编辑:如果有比这两种方法更快的方法,那也会有帮助。