优化比较两个列表的方法

时间:2016-08-12 21:58:13

标签: c# list for-loop unity3d compare

我需要将两个列表与图形打印的值进行比较。如果值相同,我什么都不做,当某些内容发生变化时,图表就会被重新打印。它可以工作但是在Unity中它会暂时停留一段时间,但足以引起口吃。我想我每秒从网上下载值的事实也无济于事。我在下面发布了我的代码,有没有办法让它更快?

void MinMaxPosition(UILineRenderer graph)
{
    bool equals = true;
    MaxPosition = this.GetComponent<TextReader>().prices.Max() + this.GetComponent<TextReader>().prices.Max() * 0.0003f;
    MinPosition = this.GetComponent<TextReader>().prices.Min() - this.GetComponent<TextReader>().prices.Min() * 0.0003f;
    print(MaxPosition);
    print(MinPosition);
    for(int i = 0;i<graph.Points.Count();i++)
    {
        if (((graph.Points[i].y / 0.8) * MaxPosition - MinPosition) + MinPosition != this.GetComponent<TextReader>().prices.ElementAt(i))
        {
            equals = false;
            break;
        }
    }
    if (GetComponent<TextReader>().prices.Count != lastSize || equals == false)
    {
        ReprintGraph(graph);
    }
    lastSize = GetComponent<TextReader>().prices.Count;
}

3 个答案:

答案 0 :(得分:2)

1)什么是GetComponent()?一些DI引擎?哪一个?如果你正在使用Ninject,那是最慢的那个,你应该切换到更快的。

2)无论GetComponent()是什么,你为什么要用该方法调用50次?只需在顶部调用一次并保存TextReader实例。如果您使用慢速DI引擎,那将会变得昂贵。

3)列表中有多少个点?

4)检查是否有比您正在使用的方法更轻的方法。即Count()vs. Length,ElementAt vs. []等

5)这个需要更多的工作,但值真的每秒都会改变吗?如果没有,你就浪费了很多时间。比较每一秒。弄清楚他们真正改变的频率,并找出可接受的延迟程度。一种解决方案是在更改时推送它们,而不是循环轮询。

如果是我,我会做的第一个优化是摆脱50个GetComponent()调用并从那里开始。

答案 1 :(得分:2)

我建议的第一件事就是缓存GetComponent()的结果 - 这通常是一个非常昂贵的操作,而且你是在一个紧凑的循环中调用它。我也非常小心尝试与浮点数进行比较;由于浮点精度问题,导致ReprintGraph(图形)的调用频率超出预期,因此很容易被关闭;使用Mathf.Approximately()可能更好。所以我会更改这个代码块。

TextReader _textReader = null;
void MinMaxPosition(UILineRenderer graph)
{
    bool equals = true;
    if (_textReader == null)
    {
        _textReader = this.GetComponent<TextReader>();
    }

    MaxPosition = _textReader.prices.Max() + _textReader.prices.Max() * 0.0003f;
    MinPosition = _textReader.prices.Min() - _textReader.prices.Min() * 0.0003f;
    print(MaxPosition);
    print(MinPosition);
    for(int i = 0;i<graph.Points.Count();i++)
    {
        if (!Mathf.Approximately( ((graph.Points[i].y / 0.8) * MaxPosition - MinPosition) + MinPosition , _textReader.prices.ElementAt(i)) )
        {
            equals = false;
            break;
        }
    }
    if (_textReader.prices.Count != lastSize || equals == false)
    {
        ReprintGraph(graph);
    }
    lastSize = _textReader.prices.Count;
}

答案 2 :(得分:1)

请勿在运行时使用.GetComponent()或GameObject.Find()。这需要太多资源。 如果您需要这样做 - 您需要在开始或清醒时执行此操作。

如果可能的话,你需要使用transform.Find()(或transform.FindChild - 与transform.Find相同 - 所以无论如何)。这比GameObject.Find()

更轻量级

这可能是你有滞后的原因。首先尝试修复此问题,如果滞后不能修复,请将结果和更新的代码写给我。