C#-JIT是否会在Java的灵感中实现未来版本的“内联虚拟方法”优化?

时间:2017-03-24 10:40:32

标签: java c# inline jit virtual-method

或者我应该考虑将我的虚拟索引方法(及其类)重构为代码重复但速度更快的方法吗?

我遇到的问题是,我有一些重复的代码,然后重构它们并统一到一个类中,只在子类中使用单个虚方法,以最大限度地减少将来的代码重复。现在它的%50比以前慢了很多:

 arr[i]=3.14f; // arr is derived from a base class with `[]` override
 (so the derived class implementation is used).

但现在更容易添加新类型%。

非虚拟方法中有多少if-else检查使得它与没有if-else检查的虚拟方法一样快(?今天20-30长度流水线cpus)float + char + double +其他一些结构=我的库中将有超过15种不同的类型,因此15x代码重复会使代码%1500在没有虚拟方法的情况下更难实现/重构。

我的问题示例:

// implemented IList because C# arrays instead of this, 
// can be used in same wrapper property too! 
// Reduced even more code duplication.
public class Foo<T>:IList<T>
{
    public virtual T this [int i]
    { ... }
}

public unsafe class Bar:Foo<byte>
{
    public override byte this[int i]
    {
            get
            {
               return *(pByte + i);
            }
            set
            {
               *(pByte + i) = value;
            }
         }
    }
 }

 Bar b=new Bar(); // Can't use Foo<byte> 
 // because I denied that with making its constructor `internal`
 // because its mis-use would generate undefined behaviour(more than an out-of-bounds  access) in a random time in a random place.

 b[400]=50;

我必须在没有virtual的情况下复制代码的原因是,T泛型类型不允许指针。

我必须使用指针的原因是,我有非托管的快速gpgpu C ++数组,当从外面看时,就像纯C#一样工作。

我必须为gpgpu使用非托管数组的原因是,当它们与4096等无法获取的值对齐时,它们以最高速度工作,并且需要固定并且还要减少C# - C ++转换开销。

注意:也许它不仅是虚拟的,而且还有IList<T>界面导致缓慢。许多答案都说it comes with a cost但是如果Java可以解决它,为什么C#不能解决?

这是环境:

  • .Net 3.5
  • MSVS 2015社区版。已启用所有优化。
  • windows 10 64位
  • 项目64位版本
  • c3060 cpu,单通道ddr3 ram
  • 用于基准测试,添加加热阶段,在多次迭代后进行计时并用于实际数据可视化。

0 个答案:

没有答案