pow()函数和直接用乘法的性能比较——以camel函数为例

最近在用C++编写模拟退火算法,并用Camel函数对算法的性能进行测试,由于模拟退火算法的特性,在程序运行中需要非常多次地计算Camel函数的值。

首先介绍一下Camel函数:

  

函数的表达式中有一个x的四次幂,多个x、y的平方项,最早是想用pow()函数来计算, 后来又直接用乘法的表达式来计算,不知道哪个会快一些,这个对于SA算法的性能还是蛮关键的,于是做了个简单的测试,具体看代码了:

Func1:全部用乘法;

Func2:四次幂用pow(),其余用乘法;

Func3:全部用pow()函数来计算;

#include <iostream>
#include <cmath>
#include <ctime>
#include <vector>
using namespace std;

//Func1:全部用乘法
double Func1(const vector<double> &state)
{
    double x = state[0];
    double y = state[1];
    double f = (4 - 2.1*x*x + x*x*x*x / 3.0)*x*x + x*y + (-4 + 4.0 * y*y)*y*y;
    return  f;

}
//Func2:四次幂用pow(),其余用乘法
double Func2(const vector<double> &state)
{
    double x = state[0];
    double y = state[1];
    double f;
    f = (4 - 2.1*x*x + pow(x,4) / 3.0)*x*x + x*y + (-4 + 4.0 * y*y)*y*y;
    return f;
}
//Func3:全部用pow()函数来计算
double Func3(const vector<double> &state)
{
    double x = state[0];
    double y = state[1];
    double f;
    f = (4 - 2.1*pow(x, 2) + pow(x, 4) / 3.0)*pow(x, 2) + x*y + (-4 + 4.0 * pow(y, 2))*pow(y, 2);
    return f;
}

int main()
{
    vector<double> initialState(2);
    initialState[0] = 0.0898;
    initialState[1] = -0.7126;

    clock_t start, end;

    //Func1的测试
    int i = 10000000;
    start = clock();
    while (i--)
    {
        Func1(initialState);
    }
    end = clock();
    cout << "Func1 cost: " << (double)(end - start) / CLOCKS_PER_SEC << endl;

    //Func2的测试
    int j = 10000000;
    start = clock();
    while (j--)
    {
        Func2(initialState);
    }
    end = clock();
    cout << "Func2 cost: " << (double)(end - start) / CLOCKS_PER_SEC << endl;

    //Func3的测试
    int k = 10000000;
    start = clock();
    while (k--)
    {
        Func3(initialState);
    }
    end = clock();
    cout << "Func3 cost: " << (double)(end - start) / CLOCKS_PER_SEC << endl;

    getchar();
    return 0;
}

结果如下:

可以看到,在运行10000000次后,计算速度的差距就体现出来了,使用乘法的速度最快,大约只有第三个函数的35%

时间: 2024-12-23 09:58:20

pow()函数和直接用乘法的性能比较——以camel函数为例的相关文章

使用函数打印出m乘法表

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> </head> <body> <script type="text/javascript"> /* 使用函数打印出m乘法表 */ function cf (m) { v

C++性能榨汁机之虚函数的开销

C++性能榨汁机之虚函数的开销 来源  http://irootlee.com/juicer_vtable/ 虚函数的实现 虽然C++标准并没有规定编译器实现虚函数的方式,但是大部分编译器均是采用了虚函数表来实现虚函数,即对于每一个包含虚成员函数的类生成一个虚函数表,一个指向虚函数表的指针被放在对象的首地址(不考虑多继承等复杂情况),虚函数表中存储该类所有的虚函数地址.当使用引用或者指针调用虚函数时,首先通过虚函数表指针找到虚函数表,然后通过偏移量找到虚函数地址并调用.关于虚函数表的更多细节,建

黑 马 程 序 员_视频学习总结&lt;c语言&gt;----02 printf和scanf函数、基本语句和运算、流程控制、函数、数组、字符串

---------------------- ASP.Net+Unity开发..Net培训.期待与您交流! ---------------------- 一.printf函数 1.在使用peintf函数前必须加入#include <stdio.h>,使用它可以向标准输出设备(比如屏幕)输出数据,其中使用格式是 printf(“字符串”) :或者 printf(“字符串”, 格式符参数): 2.常用的格式符及其含义如图所示 3.格式符还可以添加输出宽度 二.scanf函数 1.在使用scanf函

Python学习笔记八:文件操作(续),文件编码与解码,函数,递归,函数式编程介绍,高阶函数

文件操作(续) 获得文件句柄位置,f.tell(),从0开始,按字符数计数 f.read(5),读取5个字符 返回文件句柄到某位置,f.seek(0) 文件在编辑过程中改变编码,f.detech() 获取文件编码,f.encoding() 获取文件在内存中的编号,f.fileno() 获取文件终端类型(tty.打印机等),f.isatty() 获取文件名,f.name() 判断文件句柄是否可移动(tty等不可移动),f.seekable() 判断文件是否可读,f.readable() 判断文件是

python--函数的返回值、函数参数的使用、名称空间与作用域、函数嵌套、函数对象

今天学习内容有函数的返回值.函数参数的使用.名称空间与作用域.函数嵌套. 下来我们一一查看. 函数的返回值 看几个栗子: def func(x): return x**2 y=func(10) print(y) def foo(): return None res=foo() print(res) def foo(): return{'a':1} res=foo() print(res['a']) def foo(): return {'a':1},1,'a',[1,2] res=foo() p

区间成员函数优先于与之对应的单元素成员函数

 例子:使v1的内容和v2的后半部分相同的最简单操作是什么?看下面四个答案: ①v1.assign(v2.begin()+v2.size()/2,v2.end()); ②v1.clear(); copy(v2.begin()+v2.size()/2,v2.end(),back_inserter(v1)); ③v1.insert(v1.end(),v2.begin()+v2.size()/2,v2.end()); ④vector<int>v1,v2; - v1.clear(); for(ve

C++学习45 流成员函数put输出单个字符 cin输入流详解 get()函数读入一个字符

在程序中一般用cout和插入运算符“<<”实现输出,cout流在内存中有相应的缓冲区.有时用户还有特殊的输出要求,例如只输出一个字符.ostream类除了提供上面介绍过的用于格式控制的成员函数外,还提供了专用于输出单个字符的成员函数put.如:    cout.put('a');调用该函数的结果是在屏幕上显示一个字符a.put函数的参数可以是字符或字符的ASCII代码(也可以是一个整型表达式).如    cout.put(65 + 32);也显示字符a,因为97是字符a的ASCII代码. 可以

递归:若函数包含了对其自身的调用,该函数为递归的。《Python核心编程》P305

递归:若函数包含了对其自身的调用,该函数为递归的. >>> #递归 <Python核心编程>P305 >>> def factorial(n): if n==0 or n==1:#0!=1!=1 return 1 else: return n*factorial(n-1) >>> factorial(3) 6 >>> factorial(4) 24 >>> 原图

函数输入参数类型为枚举时,则限定函数参数的接收范围,非枚举值输入则错误

1 typedef enum 2 { 3 Mon = 1, 4 Tues, 5 Wed, 6 Thurs, 7 Fri, 8 Sat, 9 Sun 10 }week; 11 12 void week_func(week day) 函数参数 day 为枚举类型week,在使用函数 week_func() 时,参数只接收枚举值 Mon ~ Sun,输入数值1···或枚举值之外的值都是错误的 原文地址:https://www.cnblogs.com/skullboyer/p/9060056.html