或者我应该考虑将我的虚拟索引方法(及其类)重构为代码重复但速度更快的方法吗?
我遇到的问题是,我有一些重复的代码,然后重构它们并统一到一个类中,只在子类中使用单个虚方法,以最大限度地减少将来的代码重复。现在它的%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#不能解决?
这是环境: