gpt4 book ai didi

performance - 提高 Clojure 中点云边界框计算的性能

转载 作者:行者123 更新时间:2023-12-04 02:58:59 25 4
gpt4 key购买 nike

我正在计算 Clojure 中 3d 点云的边界框。点云表示为 Java 原始浮点数组,点云中的每个点都使用 4 个浮点存储,其中最后一个浮点未使用。像这样:

[x0 y0 z0 u0  x1 y1 z1 u1 .... ]

点云的大小为 19200,即数组中的 4*19200 个浮点数。

其中一些值可能不是有限的(它们是无限的或 NaN)。因此,任何包含非有限值的点都应完全排除在计算之外。我已经在 J​​ava 和 Clojure 中实现了这个计算,但出于某种原因,Clojure 版本仍然慢了大约 4 到 5 倍。

这是 Clojure 代码的样子:
(defn good-compute-bbox [^floats data]
(let [n (alength data)]
(loop [i (int 0)
minx (float (aget data 0))
maxx (float (aget data 0))
miny (float (aget data 1))
maxy (float (aget data 1))
minz (float (aget data 2))
maxz (float (aget data 2))]
(if (< i n)
(let [x (float (aget data (unchecked-add i 0)))
y (float (aget data (unchecked-add i 1)))
z (float (aget data (unchecked-add i 2)))]
(if (and (Float/isFinite x)
(Float/isFinite y)
(Float/isFinite z))
(recur (unchecked-add-int i (int 4))
(min minx x)
(max maxx x)
(min miny y)
(max maxy y)
(min minz z)
(max maxz z))
(recur (unchecked-add-int i (int 4))
minx
maxx
miny
maxy
minz
maxz
))
)
[minx maxx miny maxy minz maxz]))))

这就是 Java 代码的样子:

public class BBox {

public static float[] computeBBox(float[] data) {
long n = data.length;
float[] result = new float[6];

float minx = data[0];
float maxx = data[0];
float miny = data[1];
float maxy = data[1];
float minz = data[2];
float maxz = data[2];
for (int i = 0; i < n; i += 4) {
float x = data[i + 0];
float y = data[i + 1];
float z = data[i + 2];
if (java.lang.Float.isFinite(x) &&
java.lang.Float.isFinite(y) &&
java.lang.Float.isFinite(z)) {

minx = x < minx? x : minx;
maxx = x > maxx? x : maxx;

miny = y < miny? y : miny;
maxy = y > maxy? y : maxy;

minz = z < minz? z : minz;
maxz = z > maxz? z : maxz;
}
}

result[0] = minx;
result[1] = maxx;
result[2] = miny;
result[3] = maxy;
result[4] = minz;
result[5] = maxz;

return result;
}
};

我的问题是:我可以对我的 Clojure 代码进行哪些更改以使其运行速度与 Java 代码一样快?如果您测试了代码并测量了加速情况,那就加分了。

如果你想重现实验和 published on my Github repository here .

最佳答案

这里的罪魁祸首——正如我从你的代码中看到的,你已经怀疑了——是 min .它适用于各种类型,而且速度不是那么快。

通过使用 Apache 的 commons 快速数学,您可以得到 10% 以内的 Java:

(defn primitive-compute-bbox-new [^floats data]
(let [n (alength data)]
(loop [i (int 0)
minx (aget data 0)
maxx (aget data 0)
miny (aget data 1)
maxy (aget data 1)
minz (aget data 2)
maxz (aget data 2)]
(if (< i n)
(let [x (aget data (unchecked-add i 0))
y (aget data (unchecked-add i 1))
z (aget data (unchecked-add i 2))]
(if (and (Float/isFinite x)
(Float/isFinite y)
(Float/isFinite z))
(recur (unchecked-add-int i 4)
(FastMath/min (float minx) x)
(FastMath/max (float maxx) x)
(FastMath/min (float miny) y)
(FastMath/max (float maxy) y)
(FastMath/min (float minz) z)
(FastMath/max (float maxz) z))
(recur (unchecked-add-int i 4)
minx
maxx
miny
maxy
minz
maxz)))
[minx maxx miny maxy minz maxz]))))

部:
[org.apache.commons/commons-math3 "3.6.1"]

关于performance - 提高 Clojure 中点云边界框计算的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49423231/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com