想改进这个问题吗 通过编辑此帖子,更新问题,使其仅关注一个问题。
我在这里有一个小循环,我想知道我是否犯了一些大错误。
例如,有没有办法以不同的方式重写它的一部分,使矢量化成为可能(假设GCC4.8.1和所有矢量化友好标志启用)?
这是传递列表数字的最佳方式吗(常数浮点数name_of_var[])?
代码的思想是获取一个向量(在数学意义上,不一定是std::向量),该向量由(未排序的数字)y
和两个边界值(ox[0])组成
rdx
可以包含m
,而y
具有n
n的容量
提前感谢,
void foo(const int n,const int m,const float y[],const float ox[],int rdx[]){
int d0,j=0,i=0;
for(;;){
i++;
d0=((y[i]>=ox[0])+(y[i]<=ox[1]))/2;
if(d0==1){
rdx[j]=i;
j++;
}
if(j==m) break;
if(i==n-1) break;
}
}
A、 是的,将float数组作为float[]传递不仅有效,而且是唯一的方法(与float*参数相同)。
解答 1.但在C中,您可以使用更好的类型而不会降低性能。访问矢量或数组(标准库容器)不应比访问普通 C 样式数组慢。我强烈建议您使用这些。在现代C中,也有可能使用迭代器和函子;我不是这方面的专家,但是如果你能够通过更抽象来表达不同元素的操作的独立性,你可能会给编译器生成更适合矢量化的代码的机会。
B.应将除法替换为逻辑 AND 运算符
C、 当使用-O3编译时,中间变量d0可能会消失,但它仍然是不必要的。
其余的在性能上是可以的。正如已经表明的那样,惯用的是有改进的空间。
D.我不确定是否有机会使用此处介绍的代码进行矢量化。编译器可能会在 -O3 处执行一些循环展开;尝试让它发出SSE代码(参见 http://gcc.gnu.org/onlinedocs/,特别是 http://gcc.gnu.org/onlinedocs/gcc-4.8.2/gcc/i386-and-x86-64-Options.html#i386-and-x86-64-Options)。谁知道呢。
哦,我刚刚意识到,您的原始代码将常数区间边界作为一个包含2个元素的数组来传递,ox[]。由于数组访问是不必要的间接访问,因此可能会带来开销,所以这里最好使用两个普通的float参数。让它们像你的数组一样保持不变。你也可以给它们起个好听的名字。
只是为了确保我是正确的:你试图找到第一个m 1(如果它实际上是m,j == m-1)值在[ox[0],ox[1]的范围内吗?
如果是这样,那么这样做不是更好
for (int i=0, j=0;;++i) {
if (y[i] < ox[0]) continue;
if (y[i] > ox[1]) continue;
rdx[j] = i;
j++;
if (j == m || i == n-1) break;
}
d0=((y[i]>=ox[0])+(y[i]<=ox[1]))/2;
if(d0==1)
我认为使用一个中间变量是没有用的,还需要几个周期
这是我能想到的最优化的版本,但它完全不可读......
void foo(int n, int m, float y[],const float ox[],int rdx[])
{
for(int i = 0; i < n && m != 0; i++)
{
if(*y >= *ox && *y <= ox[1])
{
*rdx=i;
rdx++;
m--;
}
y++;
}
}
我认为下面这个带有适当优化标志的版本应该可以完成这项工作
void foo(int n, int m,const float y[],const float ox[],int rdx[])
{
for(int j = 0, i = 0; j < m && i < n; i++) //Reorder to put the condition with the highest probability to fail first
{
if(y[i] >= ox[0] && y[i] <= ox[1])
{
rdx[j++] = i;
}
}
}
问题内容: 如果即时通讯使用2个查询: 首先:查询所需的所有键/ ID 第二个:从tab1中选择*,其中tab1.id在(… ids列表.. ,,)中 id列表可以是几千个… 这样做是明智的选择还是最佳实践? 问题答案: 通常,在语句中使用IN子句是完全可以接受的最佳实践…假设您对更大的值集使用子查询。 答案应该永远是: 取决于 !从您的问题尚不清楚,您的值列表将是SELECT还是对它们进行硬编码
老项目遗留了一些代码,VUE页面里面的代码太长了 想把TS代码拆分出来,请问最佳实践是什么样子的? 旧代码:
这里有些给使用和编写 Ansible playbook 的贴士. 你能在我们的 ansible-example repository.找到展示这些最佳实践的 playbook 样例.(注意: 这些示例用的也许不是最新版的中所有特性,但它们仍旧是极佳的参考.) Topics 最佳实践 接下来的章节将向你展示一种组织 playbook 内容方式. 你对 Ansible 的使用应该符合你的需求而不是我们
处理后台任务与常规调用方法有很大的不同。本指南旨在帮助让您的后台任务平稳有效地运行。本文基于 这篇博客文章。 使任务参数小而简单 方法(任务)在调用之前会被序列化。使用 TypeConverter 类将参数转换为 JSON 字符串。如果您有复杂的实体和 / 或大对象; 包括数组,最好将它们放入数据库,然后只将其标识 (id) 传递给后台任务。 错误例子: public void Method(En
VR设计 VR设计不同于平面体验设计。作为一种新的媒介,有新的最佳实践需要遵循,特别是保持用户的舒适性和存在性。这在如下指南中已经写得很透彻了: Oculus VR最佳实践 Leap Motion VR最佳实践指南 一些值得注意的事情: 公共的金科玉律是永远不要意外地把相机控制权从用户手中剥夺。 单位(比如对于位置)应该考虑使用米(m)。这是因为WebVR API以米为单位返回姿势数据,进而传送给
本章文档将阐述一些使用herosphp开发一些常用模块的一些比较好的实践。 未完待续。。。