我有以下代码用于计算两个向量之间的距离:
double dist(vector<double> & vecA, vector<double> & vecB){
double curDist = 0.0;
for (size_t i = 0; i < vecA.size(); i++){
double dif = vecA[i] - vecB[i];
curDist += dif * dif;
}
return curDist;
}
Run Code Online (Sandbox Code Playgroud)
此功能是我应用程序中的主要瓶颈,因为它依赖于大量距离计算,在典型输入上占用超过60%的CPU时间.另外,以下行:
double dif = vecA[i] - vecB[i];
Run Code Online (Sandbox Code Playgroud)
在此功能中负责超过77%的CPU时间.我的问题是:是否有可能以某种方式优化此功能?
笔记:
我试图理解我必须在作业中回答的以下问题.它询问无限迭代器.他们会在哪里有用?我认为迭代器用于遍历集合,如:
Iterator itr = ArrayList.iterator();
while (itr.hasNext())
{
System.out.println(itr.next());
}
Run Code Online (Sandbox Code Playgroud)
一旦itr到达集合的末尾,就完成了,只要在迭代过程中不必进行其他操作.那么为什么甚至打扰无限的迭代器呢?
我试图找到存储指令的指针操作数和函数参数之间的别名.这是代码,
virtual void getAnalysisUsage(AnalysisUsage &AU) const {
AU.addRequiredTransitive<AliasAnalysis>();
AU.addPreserved<AliasAnalysis>();
}
virtual bool runOnFunction(Function &F) {
AliasAnalysis &AA = getAnalysis<AliasAnalysis>();
for(Function::iterator i=F.begin();i!=F.end();++i){
for(BasicBlock::iterator j=i->begin();j!=i->end();++j)
{
if(dyn_cast<StoreInst>(j)){
const StoreInst *SI=dyn_cast<StoreInst>(j);
AliasAnalysis::Location LocA = AA.getLocation(SI);
const Value *si_v= SI->getPointerOperand();
for(Function::arg_iterator k=F.arg_begin(); k!=F.arg_end();++k)
{
Value *v=dyn_cast<Value>(k);
AliasAnalysis::Location loc=AliasAnalysis::Location(v);
AliasAnalysis::AliasResult ar=AA.alias(LocA,loc);
switch(ar)
{
case 0:errs()<< "NoAlias\n";
break;
///< No dependencies.
case 1:errs()<<"MayAlias\n"; ///< Anything goes
break;
case 2: errs()<<"PartialAlias\n";///< Pointers differ, but pointees overlap.
break;
case 3: errs()<<"MustAlias\n";
}
}
}
return true;
}
}; …Run Code Online (Sandbox Code Playgroud) 我有一个int数组,我已经为100个元素分配了空间.还有另一个阵列inShort[].我怎样才能转换inInt[]成inShort[]?
是否有必要分配新的内存,inShort[]或者有一种方法可以投射到inInt[]?
int inInt[] = new int[100];
short inShort[];
Run Code Online (Sandbox Code Playgroud) 我最近在bitsquid博客上阅读了一篇关于如何管理内存的文章,作者开始讨论vtable以及编译器如何将类添加到类中.这是该文章的链接.因为我几乎不知道关于这个问题的事情,所以我开始在网上寻找解释.我来到了这个链接.根据我读到的内容,我制作了以下代码:
char cache[24];
printf("Size of int = %d\n", sizeof(int));
printf("Size of A = %d\n", sizeof(A));
A* a = new(cache)A(0,0);
printf("%s\n",cache);
printf("vTable : %d\n",*((int*)cache));
printf("cache addr: %d\n",&cache);
int* funcPointer = (int*)(*((int*)cache));
printf("A::sayHello: %d\n",&A::sayHello);
printf("funcPointer: %d\n",*funcPointer);
Run Code Online (Sandbox Code Playgroud)
A是一个具有两个整数成员和一个虚函数的类sayHello().
编辑:这是类定义:
class A {
public:
int _x;
int _y;
public:
A(int x, int y) : _x(x), _y(y){ }
virtual void sayHello() { printf("Hello You!"); }
};
Run Code Online (Sandbox Code Playgroud)
基本上我试图做的是看看vtable中的指针是否指向与我所从的地址相同的位置&A::sayHello,但问题是当我运行程序时,vtable中指针内的地址和sayHello()地址总是有区别的295.有谁知道为什么会发生这种情况?是否有某种标题被添加,我错过了?我在64位机器上运行visual studio express 2008.
从我调试的地址返回的 …
我正在对算法进行基准测试,没有必要知道细节.主要组件是缓冲区(整数的原始数组)和索引器(整数 - 用于访问缓冲区中的元素).
缓冲区的最快类型似乎是unsigned char,以及short,int,long的有符号和无符号版本.但是char/signed char更慢.差异:1.07倍.
对于索引器,有符号和无符号类型之间没有区别.然而,int和long比char和short快1.21倍.
在考虑性能而不是内存消耗时,是否应该默认使用某种类型?
注意:缓冲区元素和索引器上使用的操作是赋值,递增,递减和比较.
在一些文章中,他们建议使用fistp指令以快速方式转换float-> integer.这取决于CPU的当前舍入模式,因此您必须进行设置.
但是这个舍入模式是否可以在程序运行期间被其他程序更改?通过操作系统?
更糟糕的是,这是一种可能的情况(伪代码)吗?
set_rounding_mode(ROUND_TRUNCATE);
/* process gets switched out and other process sets the rounding mode to round */
int x = round_with_fistp(0.6);
printf("%d\n", x); // prints 1
Run Code Online (Sandbox Code Playgroud) 我已经使用GMP库和C++来编写Gauss-Legendre算法的实现来计算pi的数字.
它有正确的输出,但问题是我不知道输出"变坏",因为我必须在代码中指定精度.
以下是使用64位精度的输出:3.141592653589793238*35*,后两位数字不正确.
我的问题是,如果我想ň pi的数字,有多少精度比特b,多少算法的迭代我将需要?
谢谢
我将C++ streambuf类用于编译器项目,并且需要一种方便的方法来获取流中的当前位置.
有两个成员函数,streambuf::pubseekpos和一个streambuf::pubseekoff,来修改位置,我很困惑没有streambuf::pubgetpos成员函数(或类似的东西)来阅读它.
似乎有两种可能的解决方法:
我可以将当前位置保存在单独的变量中,并在每次从流中读取字符时手动修改它.
我可以调用streambuf::pubseekoff(0, ios_base::cur),返回新的流位置.
对于这样一个微不足道的任务,第二种选择似乎是可用的,但是效率低下且不美观.有没有更好的方法呢?
我是学习x86和ARM架构的学生.
我想知道将多个数据放入SIMD寄存器需要多少个周期?
据我所知,x86 SSE的xmms寄存器具有128位大小的寄存器.
如果我想通过SIMD指令集和汇编语言将32位8位数据从堆栈中放入xmms寄存器中,
对于通用寄存器的PUSH/POP,它具有相同的循环时间吗?
或者每8位数据需要32倍的时间吗?
感谢您的关注和关注!