第一种方法利用System.DateTime.Now:
static void SubTest()
{
DateTime beforDT = System.DateTime.Now;
//耗时巨大的代码
DateTime afterDT = System.DateTime.Now;
string totaltime = afterDT.Subtract(beforDT).TotalSeconds.ToString("F3",
CultureInfo.InvariantCulture);
MessageBox.Show("共"+ totaltime + "秒!");
double ts = afterDT.Subtract(beforDT).TotalMilliseconds;
Console.WriteLine("DateTime总共花费{ts}ms");
}
第二种用Stopwatch类(System.Diagnostics):
static void SubTest()
{
Stopwatch sw = new Stopwatch();
sw.Start();
//耗时巨大的代码
sw.Stop();
TimeSpan ts2 = sw.Elapsed;
Console.WriteLine("Stopwatch总共花费{0}ms.", ts2.TotalMilliseconds);
}
Timing tt = new Timing();
tt.Write();
// 模拟耗时操作
tt.Stop();
Thread.Sleep(300); // 1.5秒
tt.Write();
//xxx
tt.Reset();
tt.Write();
using System.Diagnostics;
namespace TT1
{
public class Timing
{
private Stopwatch _stopwatch; // 更符合C#命名规范的变量名
// 构造函数:初始化并启动秒表
public Timing()
{
_stopwatch = Stopwatch.StartNew(); // 直接使用StartNew()简化初始化
}
// 无参写入方法:输出默认提示和当前时间(秒)
public void Write()
{
Z.WriteMessage($"\n>>> 计时开始,当前时间: {GetFormattedSeconds()}");
_stopwatch.Start(); // 写入时重置计时(原逻辑可能隐含"开始计时"的意图)
}
// 带参写入方法:输出自定义提示和当前时间(秒)
public void Write(string message)
{
Z.WriteMessage($"\n{message} >>> 计时开始,当前时间: {GetFormattedSeconds()}");
_stopwatch.Start(); // 写入时重置计时
}
// 秒(保留1位小数)
public double Seconds => _stopwatch?.Elapsed.TotalSeconds ?? 0;
// 格式化的秒字符串(如 "12.3秒")
public string FormattedSeconds => $"{Seconds:F1}秒";
// 停止计时
public void Stop()
{
_stopwatch?.Stop();
}
// 关键新增:继续计时(从上次暂停的时间点继续累计)
public void Start()
{
if (!_stopwatch.IsRunning) // 避免重复启动
_stopwatch.Start();
}
// 关键新增:重置时间为0(保持当前运行状态)
public void Reset()
{
bool wasRunning = _stopwatch.IsRunning; // 记录当前是否在运行
_stopwatch.Reset(); // 重置累计时间为0
if (wasRunning) _stopwatch.Start(); // 若之前在运行,重置后继续计时
}
// 辅助方法:获取格式化的秒数(处理null情况)
private string GetFormattedSeconds()
{
return _stopwatch is null ? "0.0秒" : $"{_stopwatch.Elapsed.TotalSeconds:F1}秒";
}
}
}