JoshWindsor 发表于 2021-4-22 09:14

使用Unity的Job System性能为什么没有明显提升?

最近在看Job System,做了一下性能对比,当计算数量在100000以内时,使用Job System反而不如正常的处理。

RedZero9 发表于 2021-4-22 09:18

最近也在使用和研究jobsystem,简单回答一下
首先jobsystem为了保证无锁多线程,内部做了很多job编排工作,所以在数据量很小的时候,这种编排操作就会造成比单线程耗时还长的情况出现
其次jobsystem可以用burst compiler优化,使用unity特定的数学库中的数据类型可以获取simd优化,比如vector3就可以换成float3
下面给出我的测试代码和结果
using Unity.Burst;
using Unity.Collections;
using Unity.Jobs;
using Unity.Mathematics;
using UnityEngine;
using UnityEngine.Profiling;

public class TestJob : MonoBehaviour
{
    public int DataCount;

    private NativeArray<float3> m_JobDatas;

    private NativeArray<float> m_JobResults;

    private Vector3[] m_NormalDatas;
   
    private float[] m_NormalResults;
   

// Job adding two floating point values together
   
    public struct MyParallelJob : IJobParallelFor
    {
       public NativeArray<float3> data;
      public NativeArray<float> result;

      public void Execute(int i)
      {
            Vector3 item = data;
            result = Mathf.Sqrt(item.x * item.x + item.y * item.y + item.z * item.z);
      }
    }

    private void Awake()
    {
      m_JobDatas = new NativeArray<float3>(DataCount, Allocator.Persistent);
      m_JobResults = new NativeArray<float>(DataCount,Allocator.Persistent);
      
      m_NormalDatas = new Vector3;
      m_NormalResults = new float;
      
      for (int i = 0; i < DataCount; i++)
      {
            m_JobDatas = new float3(1, 1, 1);
            m_NormalDatas = new Vector3(1, 1, 1);
      }
    }


    // Update is called once per frame
    void Update()
    {
      //Job部分
      MyParallelJob jobData = new MyParallelJob();
      jobData.data = m_JobDatas;
      jobData.result = m_JobResults;

// Schedule the job with one Execute per index in the results array and only 1 item per processing batch
      JobHandle handle = jobData.Schedule(DataCount, 64);

// Wait for the job to complete
      handle.Complete();
      
      Profiler.BeginSample("NormalCalculate");
      
      //正常数据运算
      for(var i = 0; i < DataCount; i++)
      {
            var item = m_NormalDatas;
            m_NormalResults = Mathf.Sqrt(item.x * item.x + item.y * item.y + item.z * item.z);
      }
      
      Profiler.EndSample();
    }

    public void OnDestroy()
    {
      m_JobDatas.Dispose();
      m_JobResults.Dispose();
      m_NormalDatas = null;
      m_NormalResults = null;
    }
}Job运算结果
正常运算结果

kirin77 发表于 2021-4-22 09:26

数学计算换上mathematics,job加上Burst Attribute。速度可以成百倍提升。

BlaXuan 发表于 2021-4-22 09:30

更新一下测试结果。之前的测试只在Start方法中计算了一次,但在Update方法中发现,前期(程序开始几帧内)的消耗较大,但之后的消耗变得极小(10^7规模下,由180ms变为7ms),猜测JobSystem开始时做了初始化。
页: [1]
查看完整版本: 使用Unity的Job System性能为什么没有明显提升?