我正在处理养老金问题,代码中有以下方法:
public static double NumPMTsRemaining( double CurBalance, double ContractRate, double Pmt)
{
double rt = PeriodicRate(ContractRate);
return -1 * Math.Log(1 - (CurBalance * (rt) / Pmt)) / Math.Log(1 + (rt));
}
public static double MonthlyPMT(double OrigBalance, double ContractRate, int Term)
{
double rt = PeriodicRate(ContractRate);
if (ContractRate > 0)
return (OrigBalance * rt * Math.Pow(1 + rt, Term)) / (Math.Pow(1 + rt, Term) - 1);
else return OrigBalance / Term;
}我用前一种方法来确定贷款的支付是否能保证贷款在其存续期内得到偿还。我用后一种方法来确定一笔付款是否在一个月以外的付款期内报价,如果是的话,则用每月付款代替。经过思考,我可以在这两个任务中使用后一种方法。
考虑到这一点,我想知道是否有人知道Math.Pow是否比/相对于Math.Log更快/更有效?
我认为Math.Pow是更好的选择,但希望得到一些输入。
发布于 2014-08-13 21:56:43
我已经按照@Mangist的建议构建了一个基准。代码张贴在下面。我对@CodesInChaos的回复感到惊讶。当然,我做了一些研究,并意识到我可以改进我的大量代码。我将发布一个链接到我在这方面发现的一篇有趣的StackOverflow文章。由于上述事实,许多人已经对Math.Pow进行了改进。
再次感谢您的建议和信息。
int term = 72;
double contractRate = 2.74 / 1200;
double balance = 20203.66;
double pmt = 304.96;
double logarithm = 0;
double power = 0;
DateTime BeginLog = DateTime.UtcNow;
for (int i = 0; i < 100000000; i++)
{
logarithm=(-1*Math.Log(1-(balance*contractRate/pmt))/Math.Log(1+contractRate));
}
DateTime EndLog = DateTime.UtcNow;
Console.WriteLine("Elapsed time= " + (EndLog - BeginLog));
Console.ReadLine();
DateTime BeginPow = DateTime.UtcNow;
for (int i = 0; i < 100000000; i++)
{
power = (balance * contractRate * Math.Pow(1 + contractRate, term)) / (Math.Pow(1
+ contractRate, term) - 1);
}
DateTime EndPow = DateTime.UtcNow;
Console.WriteLine("Elapsed time= " + (EndPow - BeginPow));
Console.ReadLine();基准测试的结果是对数00:00:04.9274927的运行时间,功率为00:00:11.6981697。
我还提到了一些额外的StackOverflow讨论,这些讨论揭示了@CodeInChaos的评论。
How is Math.Pow() implemented in .NET Framework?
让我在上面的链接和Math.Pow函数之间添加一个头对头的比较。我用以下代码对Math.Pow(x,y)和Math.Exp(y*Math.Log(x))进行了基准测试:
DateTime PowBeginTime = DateTime.UtcNow;
for (int i = 0; i < 250000000; i++)
{
Math.Pow(1 + contractRate, term);
}
DateTime PowEndTime = DateTime.UtcNow;
Console.WriteLine("Elapsed time= " + (PowEndTime - PowBeginTime));
Console.ReadLine();
DateTime HighSchoolBeginTime = DateTime.UtcNow;
for (int i = 0; i < 250000000; i++)
{
Math.Exp(term * Math.Log(1 + contractRate));
}
DateTime HighSchoolEndTime = DateTime.UtcNow;
Console.WriteLine("Elapsed time= " + (HighSchoolEndTime - HighSchoolBeginTime));
Console.ReadLine();结果为: Math.Pow(x,y) 00:00:19.9469945 Math.Exp(y*Math.Log(x)) 00:00:18.3478346
https://stackoverflow.com/questions/25294937
复制相似问题