gpt4 book ai didi

java - 为什么在 this 方法中添加一个 If 语句会大大降低它的速度?

转载 作者:搜寻专家 更新时间:2023-10-30 20:02:01 24 4
gpt4 key购买 nike

我在 answering another question 中遇到了这个.我试图诊断哪个代码更改对速度有更大的影响。我在 for 循环中使用了一个 boolean 标志来在使用辅助方法构建 Color 之间切换。 .

有趣的是,当我决定哪个更快并删除 if 时,代码的速度放大了 10 倍。之前花费 140 毫秒,之后仅花费 13 毫秒。我应该只从循环中删除大约 7 个计算中的一个。为什么速度会大幅提升?

慢速代码:(当 helperMethods 为 false 时在 141 毫秒内运行) *参见编辑 2

public static void applyAlphaGetPixels(Bitmap b, Bitmap bAlpha, boolean helperMethods) {
int w = b.getWidth();
int h = b.getHeight();
int[] colorPixels = new int[w*h];
int[] alphaPixels = new int[w*h];
b.getPixels(colorPixels, 0, w, 0, 0, w, h);
bAlpha.getPixels(alphaPixels, 0, w, 0, 0, w, h);
for(int j = 0; j < colorPixels.length;j++){
if(helperMethods){
colorPixels[j] = Color.argb(Color.alpha(alphaPixels[j]), Color.red(colorPixels[j]), Color.green(colorPixels[j]), Color.blue(colorPixels[j]));
} else colorPixels[j] = alphaPixels[j] | (0x00FFFFFF & colorPixels[j]);
}
b.setPixels(colorPixels, 0, w, 0, 0, w, h);
}

快速代码:(在 13 毫秒内运行)

public static void applyAlphaGetPixels(Bitmap b, Bitmap bAlpha) {
int w = b.getWidth();
int h = b.getHeight();
int[] colorPixels = new int[w*h];
int[] alphaPixels = new int[w*h];
b.getPixels(colorPixels, 0, w, 0, 0, w, h);
bAlpha.getPixels(alphaPixels, 0, w, 0, 0, w, h);
for(int j = 0; j < colorPixels.length;j++){
colorPixels[j] = alphaPixels[j] | (0x00FFFFFF & colorPixels[j]);
}
b.setPixels(colorPixels, 0, w, 0, 0, w, h);
}

编辑: 看来问题不在于 if 在循环内。如果我将 if 提升到循环之外。代码运行速度稍快,但速度仍然很慢,为 131 毫秒:

public static void applyAlphaGetPixels(Bitmap b, Bitmap bAlpha, boolean helperMethods) {
int w = b.getWidth();
int h = b.getHeight();
int[] colorPixels = new int[w*h];
int[] alphaPixels = new int[w*h];
b.getPixels(colorPixels, 0, w, 0, 0, w, h);
bAlpha.getPixels(alphaPixels, 0, w, 0, 0, w, h);
if (helperMethods) {
for (int j = 0; j < colorPixels.length;j++) {
colorPixels[j] = Color.argb(Color.alpha(alphaPixels[j]),
Color.red(colorPixels[j]),
Color.green(colorPixels[j]),
Color.blue(colorPixels[j]));
}
} else {
for (int j = 0; j < colorPixels.length;j++) {
colorPixels[j] = alphaPixels[j] | (0x00FFFFFF & colorPixels[j]);
}
}

b.setPixels(colorPixels, 0, w, 0, 0, w, h);
}

编辑 2: 我很笨。真的很蠢。在调用堆栈的前面,我使用另一个 boolean 标志在使用此方法和使用使用 getPixel 而不是 getPixels 的另一种方法之间切换。对于所有具有 helperMethod 参数的调用,我都将此标志设置为错误。当我对没有 helperMethod 的版本进行新调用时,我做对了。性能提升是因为 getPixels 而不是 if 语句。

实际慢代码:

public static void applyAlphaGetPixel(Bitmap b, Bitmap bAlpha, boolean helperMethods) {
int w = b.getWidth();
int h = b.getHeight();
for(int y=0; y < h; ++y) {
for(int x=0; x < w; ++x) {
int pixel = b.getPixel(x,y);
int finalPixel;
if(helperMethods){
finalPixel = Color.argb(Color.alpha(bAlpha.getPixel(x,y)), Color.red(pixel), Color.green(pixel), Color.blue(pixel));
} else{
finalPixel = bAlpha.getPixel(x,y) | (0x00FFFFFF & pixel);
}
b.setPixel(x,y,finalPixel);
}
}
}

注意:所有速度均为 100 次运行的平均值。

最佳答案

尝试将条件提升到循环之外:

if (helperMethods) {
for (int j = 0; j < colorPixels.length;j++) {
colorPixels[j] = Color.argb(Color.alpha(alphaPixels[j]),
Color.red(colorPixels[j]),
Color.green(colorPixels[j]),
Color.blue(colorPixels[j]));
}
} else {
for (int j = 0; j < colorPixels.length;j++) {
colorPixels[j] = alphaPixels[j] | (0x00FFFFFF & colorPixels[j]);
}
}

关于java - 为什么在 this 方法中添加一个 If 语句会大大降低它的速度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12240472/

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