【问题标题】:Alternative for FOR LOOP with <LIST>使用 <LIST> 替代 FOR LOOP
【发布时间】:2019-09-24 05:55:04
【问题描述】:

我有一个包含 100 个精灵的列表,在某些情况下我想隐藏前 50 个,而在另一种情况下我想隐藏最后 50 个。

我正在使用 FOR LOOP:

        for (int i = 0; i < 50; i++) {
            spritelist [i].SetActive (false);
        }

我不希望我的代码循环 50 次,我担心这可能会导致性能滞后,但我认为有更好的方法:

        spritelist[0, 50].SetActive (false);

这可能吗,提前谢谢。

【问题讨论】:

  • somewhere 一些代码需要遍历这 50 个精灵,无论是你自己的 for 循环还是一些“ForEach”方法为你做的跨度>
  • 如果你必须对 50 件事情做同样的事情,就会出现循环。所以这可能无关紧要。在这种情况下,我推荐任何使代码更易于阅读的方法。我们尝试优化的小事情通常不会产生影响,但我们难以阅读的代码才是真正让我们慢下来的原因。
  • 数组本质上是一组存储单元。现代 CPU 没有允许同时对多个内存单元执行某些操作的指令(SIMD 指令例外,但它们受大小限制),因此您不能期望代码和 CPU 之间有一些神奇的东西无论它在 C# 代码中的外观如何,都允许这样做的指令 - 最后必须将其展开为 50 次迭代。但从可读性的角度来看,您可以使用 linq。

标签: c# for-loop arraylist


【解决方案1】:

恐怕这会导致性能滞后

这称为premature optimization。您担心性能,但您没有做任何事情来实际测试这种担心是否合理。现在您正在考虑采取措施纠正一个您尚未验证确实存在的问题。

我们如何测试?让我们考虑一个非常简单的程序:

using System;
using System.Collections.Generic;
using System.Diagnostics;

namespace ConsoleApp3
{
    class Program
    {
        class Sprite
        {
            private bool _isActive;
            public void SetActive(bool isActive)
            {
                _isActive = isActive;
            }
        }
        static void Main(string[] args)
        {
            List<Sprite> sl = new List<Sprite>();
            for(int i = 0; i<100; i++)
            {
                sl.Add(new Sprite());
            }

            Stopwatch spw = new Stopwatch();
            spw.Restart();
            for (int i = 0; i < 50; i++)
            {
                sl[i].SetActive(false);
            }
            Console.Write(1e6 * spw.ElapsedTicks / TimeSpan.TicksPerSecond);
            Console.WriteLine(" microseconds");
            Console.ReadLine();

        }
    }
}

在我的系统(5 年前的 i7)上,这通常会产生 20-30 微秒之间的结果。如果您考虑 100fps 的目标性能,即每帧 10 毫秒,因此此操作每帧消耗大约 0.3% 的时间预算。你觉得这值得担心吗?我不。只需编写代码,使其可读且有意义。出现问题时担心性能。

【讨论】:

    猜你喜欢
    • 2017-07-23
    • 2020-11-10
    • 2011-12-04
    • 1970-01-01
    • 2018-10-05
    • 1970-01-01
    • 1970-01-01
    • 2022-12-01
    • 1970-01-01
    相关资源
    最近更新 更多