我想提高当前二进制加法问题的速度。它的作用是创建2个大小为K的向量,并且第一个添加1.也许它不能更快但是如果可能的话请告诉我。
编辑:修改为修改常量矢量& a,const vector& B'/ P>
#include <stdio.h>
#include <windows.h>
#include <iostream>
#include <vector>
using namespace std;
vector<int> BinaryAddition(const vector<int>& a, const vector<int>& b, int tam){
vector<int> c(tam);
int ac = 0;
for(int i=tam-1; i>-1; i--){
c[i] = ((a[i] ^ b[i]) ^ ac); //a xor b xor c
ac = ((a[i] & b[i]) | (a[i] &ac)) | (b[i] & ac);
}
return c;
}
/* retorna "a - b" en segundos */
double performancecounter_diff(LARGE_INTEGER *a, LARGE_INTEGER *b)
{
LARGE_INTEGER freq;
QueryPerformanceFrequency(&freq);
return (double)(a->QuadPart - b->QuadPart) / (double)freq.QuadPart;
}
int main(int argc, char *argv[])
{
LARGE_INTEGER t_ini, t_fin;
double secs;
QueryPerformanceCounter(&t_ini);
int k=15;
vector<int> uno1 (k,0);
vector<int> pro (k,0);
vector<int> pro1(k,0);
uno1[k-1] = 1;
pro1 = BinaryAddition(pro, uno1, k);
QueryPerformanceCounter(&t_fin);
secs = performancecounter_diff(&t_fin, &t_ini);
printf("%.16g milliseconds\n", secs * 1000.0);
return 0;
}
答案 0 :(得分:3)
首先,这个:
vector<int> BinaryAddition(vector<int> a, vector<int> b, int tam)
应该是:
vector<int> BinaryAddition(const vector<int>& a, const vector<int>& b, int tam)
您无缘无故地复制输入参数向量,通过引用而不是值传递它们,这需要复制。
你可以尝试的另一件可以提高速度的方法是一种叫做loop unwinding (or unrolling)的简单技术。这肯定不会让你的代码更具可读性或更漂亮,但实际上可能会加快它的速度 - 但要将它与使用最大优化编译的简单版本(通常是编译器的选项-O3
),因为您的编译器可能已经进行了相同的优化(或者不同的优化,效果更好)。
答案 1 :(得分:1)
我只是做了一个快速的黑客来做出明显的解决方案:
vector<int> BinaryAddition3(const vector<int> &a, const vector<int> &b, int tam){
vector<int> c(tam);
int ac = 0;
for(int i=tam-1; i>-1; i--){
int t = a[i]+b[i] + ac;
ac = t > 1;
c[i] = t & 1;
}
return c;
}
这实际上比原始问题中发布的不太清晰的xor /或变体慢一点 - 慢约0.05ms。然而,这只是测量实际的添加,而不是整个矢量,并且对于35000整数长的二进制数 - 并且在我相当古老的AMD四核处理器上每次添加仍然只需要0.1毫秒。
在我的测试中,阵列的创建/初始化占总时间的一半,作为总时间的测量。添加const
引用使其大约是实际添加功能的两倍。这肯定比ORIGINAL函数更快,但就像我说的那样,它稍微慢一些 - 但更清晰。