在运行时性能方面,在Java中将int转换为short是多么昂贵?可能有成千上万的这样的铸造,因此我想知道它是否会影响性能.谢谢.
对于那些已经测量过或对此类注意事项有深入了解的人,假设您必须执行以下操作(仅选择任何示例)浮点运算符:
float calc(float y, float z)
{ return sqrt(y * y + z * z) / 100; }
Run Code Online (Sandbox Code Playgroud)
哪里y和z可能是非正规数,让我们假设两种可能的情况,其中只有 y,只有 z,或者两者,以完全随机的方式,可以是非正规数
现在假设我想避免处理非正规数的性能损失,我只想将它们视为 0,然后通过以下方式更改该段代码:
float calc(float y, float z)
{
bool yzero = y < 1e-37;
bool zzero = z < 1e-37;
bool all_zero = yzero and zzero;
bool some_zero = yzero != zzero;
if (all_zero)
return 0f;
float ret;
if (!some_zero) ret = sqrt(y * y + z * z);
else if (yzero) …Run Code Online (Sandbox Code Playgroud) 当 NEON 向量指令在 ARM 设备上可用时,我一直在寻找复制各种数据量的快速方法。
\n我做了一些基准测试,并得到了一些有趣的结果。我试图理解我所看到的东西。
\n我有四个版本来复制数据:
\n逐个元素复制:
\nfor (int i = 0; i < size; ++i)\n{\n copy[i] = orig[i];\n}\nRun Code Online (Sandbox Code Playgroud)\n此代码将四个值加载到临时寄存器中,然后将该寄存器复制到输出。
\n因此,负载数量减少了一半。可能有一种方法可以跳过临时寄存器并将负载减少四分之一,但我还没有找到方法。
\nint32x4_t tmp;\nfor (int i = 0; i < size; i += 4)\n{\n tmp = vld1q_s32(orig + i); // load 4 elements to tmp SIMD register\n vst1q_s32(©2[i], tmp); // copy 4 elements from tmp SIMD register\n}\nRun Code Online (Sandbox Code Playgroud)\nmemcpy,使用memcpy,但一次复制 4 …
最近,我和一位同事就 python 和 C++ 的性能比较进行了争论。我们俩主要使用这些语言来进行线性代数。所以我写了两个脚本,一个在 python3 中使用 numpy,另一个在 C++ 中使用 Eigen。
Python3 numpy版本matmul_numpy.py:
import numpy as np
import time
a=np.random.rand(2000,2000)
b=np.random.rand(2000,2000)
start=time.time()
c=a*b
end=time.time()
print(end-start)
Run Code Online (Sandbox Code Playgroud)
如果我运行这个脚本
python3 matmul_numpy.py
Run Code Online (Sandbox Code Playgroud)
这将返回:
0.07 seconds
Run Code Online (Sandbox Code Playgroud)
C++ 特征版本 matmul_eigen.cpp:
#include <iostream>
#include <Eigen/Dense>
#include "time.h"
int main(){
clock_t start,end;
size_t n=2000;
Eigen::MatrixXd a=Eigen::MatrixXd::Random(n,n);
Eigen::MatrixXd b=Eigen::MatrixXd::Random(n,n);
start=clock();
Eigen::MatrixXd c=a*b;
end=clock();
std::cout<<(double)(end-start)/CLOCKS_PER_SEC<<std::endl;
return 0;}
Run Code Online (Sandbox Code Playgroud)
我编译的方式是
g++ matmul_eigen.cpp -I/usr/include/eigen3 -O3 -march=native -std=c++17 -o matmul_eigen
Run Code Online (Sandbox Code Playgroud)
这将返回(c++11 和 c++17):
0.35 seconds
Run Code Online (Sandbox Code Playgroud)
这对我来说很奇怪,1-为什么 numpy 这里比 C++ 更快?我是否缺少任何其他优化标志?
我想也许是因为 python 解释器在这里执行程序更快。因此,我使用stacks …
为了满足高性能数学库的需求,我一直在对各种方法进行基准测试,以在 Rust vec 上进行就地操作(最好通过引用)。这些方法是:
map(),收集到一个新的 vec,并覆盖现有的for_each()这是基准测试代码:
use std::time::{Instant, Duration};
const N_ITEMS: usize = 100000;
const N_BENCH_TIMES: i32 = 100;
fn bench_simple() {
let mut a: Vec<i32> = vec![5; N_ITEMS];
for i in a.iter_mut() {
*i += 1;
}
}
fn bench_iterator() {
let mut a: Vec<i32> = vec![5; N_ITEMS];
let a: Vec<i32> = a.iter_mut().map(|x| *x + 1).collect();
}
fn bench_foreach() {
let mut a: Vec<i32> = vec![5; N_ITEMS];
a.iter_mut().for_each(|x| *x += …Run Code Online (Sandbox Code Playgroud) c++ ×3
arm ×1
benchmarking ×1
casting ×1
eigen3 ×1
int ×1
intrinsics ×1
java ×1
numpy ×1
performance ×1
python-3.x ×1
rust ×1
simd ×1
vector ×1
x86 ×1