如何避免大型动态对象的boxing/unboxing?
How to avoid boxing/unboxing of a large dynamic object?
我需要将两个相对较大的矩阵相乘并执行多次(在循环中)。但是,这些矩阵如何存储在内存中的格式(对象类型)应由用户选择。
存在三种可能:
double [,] M1; double [,] M2;
(二维数组)
double[][] M1; double [][]M2;
(锯齿状数组)。
Matrix <double> M1;Matrix <double> M2;
(数学网络数值格式)。
每种格式都适合相应的方法(您可能已经猜到了,取自数值库)。我需要不惜一切代价避免装箱和拆箱(因为它很昂贵)所以下面的代码对我不起作用(除非你告诉我 boxing/unboxing 比快速矩阵乘法便宜):
object M1;
object M2;
switch case
{
case 1:
M1 = new double[rows,columns];
.../etc
}
解决它的一种方法非常简单:只需声明 6 个矩阵(6 个变量)并在运行时初始化其中两个。但这看起来很难看,而且会使代码复杂得多。
我的问题:这个问题有什么优雅的解决方案吗?我是 C# 的新手,但在网站上的搜索对我帮助不大。
是的,你没问题,这里没有boxing/unboxing。我想出了我想要和需要做的事情。我将创建一个声明一些矩阵方法的接口:
interface MatrixMethods
{
void MatrixIni();
void DoMultiplication();
double ReturnFinalResult();
// etc
}
那我就用通用的class:
class MatrixStorage <T>
{
protected T M1;
protected T M2;
// etc
}
最后是需要的 class:
class MatrixMult<T> : MatrixStorage<T> , MatrixMethods
{
public void MatrixIni()
{
//etc Matrix random ini
}
public void DoMultiplication()
{
// multiplication
}
public double ReturnFinalResult()
{
// compute output
}
MatrixMult(params int[] input)
{
// ini
}
}
然后我实例化 class 并进行计算:
MatrixMethods newMatrixMult;
newMatrixMult = new MatrixMult<UserMatrixType>(userData);
newMatrixMult.DoMultiplication();
double result = newMatrixMult.ReturnFinalResult
对于误导性的问题,我深表歉意。
最佳
我需要将两个相对较大的矩阵相乘并执行多次(在循环中)。但是,这些矩阵如何存储在内存中的格式(对象类型)应由用户选择。 存在三种可能:
double [,] M1; double [,] M2;
(二维数组)double[][] M1; double [][]M2;
(锯齿状数组)。Matrix <double> M1;Matrix <double> M2;
(数学网络数值格式)。
每种格式都适合相应的方法(您可能已经猜到了,取自数值库)。我需要不惜一切代价避免装箱和拆箱(因为它很昂贵)所以下面的代码对我不起作用(除非你告诉我 boxing/unboxing 比快速矩阵乘法便宜):
object M1;
object M2;
switch case
{
case 1:
M1 = new double[rows,columns];
.../etc
}
解决它的一种方法非常简单:只需声明 6 个矩阵(6 个变量)并在运行时初始化其中两个。但这看起来很难看,而且会使代码复杂得多。
我的问题:这个问题有什么优雅的解决方案吗?我是 C# 的新手,但在网站上的搜索对我帮助不大。
是的,你没问题,这里没有boxing/unboxing。我想出了我想要和需要做的事情。我将创建一个声明一些矩阵方法的接口:
interface MatrixMethods
{
void MatrixIni();
void DoMultiplication();
double ReturnFinalResult();
// etc
}
那我就用通用的class:
class MatrixStorage <T>
{
protected T M1;
protected T M2;
// etc
}
最后是需要的 class:
class MatrixMult<T> : MatrixStorage<T> , MatrixMethods
{
public void MatrixIni()
{
//etc Matrix random ini
}
public void DoMultiplication()
{
// multiplication
}
public double ReturnFinalResult()
{
// compute output
}
MatrixMult(params int[] input)
{
// ini
}
}
然后我实例化 class 并进行计算:
MatrixMethods newMatrixMult;
newMatrixMult = new MatrixMult<UserMatrixType>(userData);
newMatrixMult.DoMultiplication();
double result = newMatrixMult.ReturnFinalResult
对于误导性的问题,我深表歉意。 最佳