如何测量IComparer花了多长时间

本文关键字:长时间 IComparer 何测量 测量 | 更新日期: 2023-09-27 18:32:35

嗨,我目前正在为我的部分项目编写测试计划,我想知道如何测量我的排序函数需要多长时间。我的尝试看起来像这样:

    private void byIGNameToolStripMenuItem_Click(object sender, EventArgs e)
    {
        GameDB.Sort(new PlayerNameComparer());
        currentEntryShown = 0;
        ShowData();
        UpdatePrevNextBtnStatus();
    }
    public class PlayerNameComparer : IComparer
    {
        Stopwatch stopwatch = new Stopwatch();
        stopwatch.Start();
        public int Compare(object x, object y)
        {
            return ((Player)x).playerIgName.CompareTo(((Player)y).playerIgName);
        }
        stopwatch.Stop();
        MessageBox.Show("Time Elapsed:" + stopwatch.ElapsedMilliseconds);
    }

但是我收到一个编译器错误:'DBProject.Form1.PlayerNameComparer.stopwatch' is a 'field' but is used like a 'type'

如何测量IComparer花了多长时间

这个答案是完全错误的,因为你在Compare方法中,并且在排序过程中被多次调用。

测试此方法的方法类似于以下内容:

private void byIGNameToolStripMenuItem_Click(object sender, EventArgs e)
{
    Stopwatch stopwatch = new Stopwatch();
    stopwatch.Start();
    GameDB.Sort(new PlayerNameComparer());
    stopwatch.Stop();
    MessageBox.Show("Time Elapsed:" + stopwatch.ElapsedMilliseconds);
    currentEntryShown = 0;
    ShowData();
    UpdatePrevNextBtnStatus();
}
public class PlayerNameComparer : IComparer
{
    public int Compare(object x, object y)
    {
        return ((Player)x).playerIgName.CompareTo(((Player)y).playerIgName);
    }
}

此外,请考虑使用 IComparer 的泛型版本,因为它是强类型,并且不需要从object类型拆箱到class类型。

一个很好的例子可能是:

public class StringComparer : IComparer<string>
{
    public int Compare(string x, string y)
    {
        return x.CompareTo(y);
    }
}

在您的情况下,可以转换为:

public class PlayerNameComparer : IComparer<Player>
{
    public int Compare(Player x, Player y)
    {
        return x.playerIgName.CompareTo(y.playerIgName);
    }
}

您是在类区域中执行语句,而不是在方法中执行语句;
在 PL 语言中 -> Nie mozesz wykonywać kodu w obrębie klasy, rób to w metodach : )
只需将它们放入方法

public int Compare(object x, object y)
{
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
int ret =((Player)x).playerIgName.CompareTo(((Player)y).playerIgName)
stopwatch.Stop();
MessageBox.Show("Time Elapsed:" + stopwatch.ElapsedMilliseconds); 
    return ret;
}

但是该代码会针对您要排序的每个项目执行,因此最好在排序之前启动手表,然后像这样停止:)

private void byIGNameToolStripMenuItem_Click(object sender, EventArgs e)
{    
    Stopwatch stopwatch = new Stopwatch();
    stopwatch.Start();
    GameDB.Sort(new PlayerNameComparer());
    stopwatch.Stop();
    MessageBox.Show("Time Elapsed:" + stopwatch.ElapsedMilliseconds); 
    currentEntryShown = 0;
    ShowData();
    UpdatePrevNextBtnStatus();
}
public class PlayerNameComparer : IComparer
{
    public int Compare(object x, object y)
    {
        return ((Player)x).playerIgName.CompareTo(((Player)y).playerIgName);
    }
}