使用Unity的Job System性能为什么没有明显提升?
最近在看Job System,做了一下性能对比,当计算数量在100000以内时,使用Job System反而不如正常的处理。 最近也在使用和研究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(&#34;NormalCalculate&#34;);
//正常数据运算
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运算结果
正常运算结果
数学计算换上mathematics,job加上Burst Attribute。速度可以成百倍提升。 更新一下测试结果。之前的测试只在Start方法中计算了一次,但在Update方法中发现,前期(程序开始几帧内)的消耗较大,但之后的消耗变得极小(10^7规模下,由180ms变为7ms),猜测JobSystem开始时做了初始化。
页:
[1]