与00:00:00:000之类的时间相关的绩效问题

时间:2013-04-02 18:47:38

标签: c#

我有this ListView。我的目标是在列表中的所有时间/选定时间添加/减去固定时间。事情是它会有大约1000-3000行,所以需要一些时间。我的目标是尽可能快地使用它。

现在,如果我垃圾邮件运行该功能,表单完成需要一些时间,如果我选择使用选定的行(其中一半),那么表单会在完成之前冻结一段时间。

我的代码现在看起来像这样(here's a picture of the code for better view):

    public void PlusMinus(bool plus)
    {
        int items_to_set = 0;
        int msec_start = 0;
        int msec_end = 0;
        int msec_box = Convert.ToInt32(mskTime.Text.Substring(9, 3)) +
        (Convert.ToInt32(mskTime.Text.Substring(6, 2)) * 1000) +
        (Convert.ToInt32(mskTime.Text.Substring(3, 2)) * 60000) +
        (Convert.ToInt32(mskTime.Text.Substring(0, 2)) * 3600000);
        if (rbtnAll.Checked) { items_to_set = listSub.Items.Count; }
        else { items_to_set = listSub.SelectedItems.Count; }


        if (rbtnAll.Checked)
        {
            for (int i = 0; i < items_to_set; i++)
            {
                msec_start = Convert.ToInt32(listSub.Items[i].SubItems[1].Text.Substring(9, 3)) +
                (Convert.ToInt32(listSub.Items[i].SubItems[1].Text.Substring(6, 2)) * 1000) +
                (Convert.ToInt32(listSub.Items[i].SubItems[1].Text.Substring(3, 2)) * 60000) +
                (Convert.ToInt32(listSub.Items[i].SubItems[1].Text.Substring(0, 2)) * 3600000);
                msec_end = Convert.ToInt32(listSub.Items[i].SubItems[2].Text.Substring(9, 3)) +
                (Convert.ToInt32(listSub.Items[i].SubItems[2].Text.Substring(6, 2)) * 1000) +
                (Convert.ToInt32(listSub.Items[i].SubItems[2].Text.Substring(3, 2)) * 60000) +
                (Convert.ToInt32(listSub.Items[i].SubItems[2].Text.Substring(0, 2)) * 3600000);

                if (plus == true) { msec_start += msec_box; msec_end += msec_box; }
                else { msec_start -= msec_box; msec_end -= msec_box; }
                TimeSpan ts = TimeSpan.FromMilliseconds(msec_start);
                listSub.Items[i].SubItems[1].Text = string.Format("{0:D2}:{1:D2}:{2:D2}:{3:D3}", ts.Hours, ts.Minutes, ts.Seconds, ts.Milliseconds);
                ts = TimeSpan.FromMilliseconds(msec_end);
                listSub.Items[i].SubItems[2].Text = string.Format("{0:D2}:{1:D2}:{2:D2}:{3:D3}", ts.Hours, ts.Minutes, ts.Seconds, ts.Milliseconds);
            }
        }
        else
        {
            for (int i = 0; i < items_to_set; i++)
            {
                msec_start = Convert.ToInt32(listSub.Items[listSub.SelectedIndices[i]].SubItems[1].Text.Substring(9, 3)) +
                (Convert.ToInt32(listSub.Items[listSub.SelectedIndices[i]].SubItems[1].Text.Substring(6, 2)) * 1000) +
                (Convert.ToInt32(listSub.Items[listSub.SelectedIndices[i]].SubItems[1].Text.Substring(3, 2)) * 60000) +
                (Convert.ToInt32(listSub.Items[listSub.SelectedIndices[i]].SubItems[1].Text.Substring(0, 2)) * 3600000);
                msec_end = Convert.ToInt32(listSub.Items[listSub.SelectedIndices[i]].SubItems[2].Text.Substring(9, 3)) +
                (Convert.ToInt32(listSub.Items[listSub.SelectedIndices[i]].SubItems[2].Text.Substring(6, 2)) * 1000) +
                (Convert.ToInt32(listSub.Items[listSub.SelectedIndices[i]].SubItems[2].Text.Substring(3, 2)) * 60000) +
                (Convert.ToInt32(listSub.Items[listSub.SelectedIndices[i]].SubItems[2].Text.Substring(0, 2)) * 3600000);

                if (plus == true) { msec_start += msec_box; msec_end += msec_box; }
                else { msec_start -= msec_box; msec_end -= msec_box; }
                TimeSpan ts = TimeSpan.FromMilliseconds(msec_start);
                listSub.Items[listSub.SelectedIndices[i]].SubItems[1].Text = string.Format("{0:D2}:{1:D2}:{2:D2}:{3:D3}", ts.Hours, ts.Minutes, ts.Seconds, ts.Milliseconds);
                ts = TimeSpan.FromMilliseconds(msec_end);
                listSub.Items[listSub.SelectedIndices[i]].SubItems[2].Text = string.Format("{0:D2}:{1:D2}:{2:D2}:{3:D3}", ts.Hours, ts.Minutes, ts.Seconds, ts.Milliseconds);
            }
        }
    }

那么我可以做出一些改变,这会对这里的表现产生一些积极的影响吗?

1 个答案:

答案 0 :(得分:3)

根本不解析字符串。相反,将数据存储为TimeSpan s,因此根本没有解析。

将数据存储为字符串无论如何都是不好的做法,因为它会使序列化和反序列化使代码混乱。

存储数据的位置并不重要。您可以使用大多数WinForms对象上的object Tag属性或将其存储在其他位置(可能在自定义列表或字典中)。

此外,您的代码看起来非常冗余。将常见的子表达式放入局部变量中。这将提高代码质量和性能。