C# 我可以使用委托缓存函数吗?
假设我有一个脚本多次访问一个函数,属于另一个类,如下所示(夸张):C# 我可以使用委托缓存函数吗?,c#,unity3d,delegates,function-pointers,C#,Unity3d,Delegates,Function Pointers,假设我有一个脚本多次访问一个函数,属于另一个类,如下所示(夸张): void Update(){ 对于(int i=0;i
void Update(){
对于(int i=0;i<10;i++){
object1.object2.object3.Function();
}
}
我用
delegate void MyDelegate();
MyDelegate myFunction;
void Start(){
myFunction = object1.object2.object3.Function;
}
void Update(){
for (int i= 0; i< 10; i++){
this.myFunction();
}
}
delegate void MyDelegate();
MyDelegate-myFunction;
void Start(){
myFunction=object1.object2.object3.Function;
}
无效更新(){
对于(int i=0;i<10;i++){
这个.myFunction();
}
}
这是否对性能有任何影响(甚至最小),因为我在取消引用这些对象时会考虑缓存命中和未命中,或者我对委托及其用法的理解是否完全错误
编辑:
因此,我用上面的代码做了一个小的基准测试,并使用Diagnostics中的Stopwatch类来测量经过的时间。是的,这两者之间没有明显的区别
我迭代了一个函数,它计算了一个浮点的平方根,100000次,测量了经过的时间,在这两种情况下都是6000ms左右。赛马,让我们知道技术上这样做没有错。但这并不吸引人。委托就像一个指向函数的变量。您还可以使用委托将函数作为方法参数传递。从技术上讲,使用委托与直接调用方法相比,会对性能产生可测量的影响,但您需要询问这与方法中实际完成的工作相比如何。虚拟方法也有成本@Priyank说的没错,它不是“缓存”,只是通过在循环外设置一个变量来避免链var a=object1.object2.object3;'。。。然后是“a.Update();”在循环中,这样做会产生非常轻微的积极影响,但我相信这将是无法衡量的。我们花在写这些评论上的时间比你的应用程序在一百年内花的时间还要多
delegate void MyDelegate();
MyDelegate myFunction;
void Start(){
myFunction = object1.object2.object3.Function;
}
void Update(){
for (int i= 0; i< 10; i++){
this.myFunction();
}
}