【发布时间】:2010-01-18 18:17:48
【问题描述】:
我有以下代码使用预先计算的内存表执行正弦/余弦函数。在以下示例中,该表有 1024*128 个项目,涵盖从 0 到 2pi 的所有正弦/余弦值。我知道我可以使用正弦/余弦对称性并仅保留 1/4 的值,但在计算值时我会有更多的“如果”。
private const double PI2 = Math.PI * 2.0;
private const int TABLE_SIZE = 1024 * 128;
private const double TABLE_SIZE_D = (double)TABLE_SIZE;
private const double FACTOR = TABLE_SIZE_D / PI2;
private static double[] _CosineDoubleTable;
private static double[] _SineDoubleTable;
设置翻译表
private static void InitializeTrigonometricTables(){
_CosineDoubleTable = new double[TABLE_SIZE];
_SineDoubleTable = new double[TABLE_SIZE];
for (int i = 0; i < TABLE_SIZE; i++){
double Angle = ((double)i / TABLE_SIZE_D) * PI2;
_SineDoubleTable[i] = Math.Sin(Angle);
_CosineDoubleTable[i] = Math.Cos(Angle);
}
}
该值是以弧度为单位的双精度值。
Value %= PI2; // In case that the angle is larger than 2pi
if (Value < 0) Value += PI2; // in case that the angle is negative
int index = (int)(Value * FACTOR); //from radians to index and casted in to an int
double sineValue = _SineDoubleTable[index]; // get the value from the table
我正在寻找一种更快的方法来做到这一点。以上 4 行占整个过程的约 25%(执行数十亿次)。
【问题讨论】:
-
您是否进行过基准测试,看看这种预计算是否真的提高了性能?
-
+1 因为有这么一个可笑的独特问题。
-
是否有可能将优化点转移到调用三角函数查找的代码上?例如,重新排序输入数据以便您可以利用缓存计算出的 Sin/Cos 值?
-
缓存未命中通常会导致超过 2 个数量级的延迟,您确定将其保存在内存中不会降低性能吗?
-
你正在使用所有的核心,不是吗?
标签: c# performance optimization