在 Java 中存储颜色 - byte;byte;byte 与 byte[3] 与 int

2024-01-02

我需要存储大量 RGB 颜色对象。对于一些常见用途,它们占用了我的应用程序总内存的 8% 到 12%。我目前将其定义如下:

class MyColor {
byte red;
byte green;
byte blue;
}

我假设(大多数)JVM 实际上对每个条目都使用 int。最简单的替代方案是:

class MyColor {
byte [] color = new byte[3];
private static final int red = 0;
private static final int green = 1;
private static final int blue = 2;
}

这会将整个数组放入一个 int 中吗?或者它是一个 int[3] ?如果是第一个,那就太好了。如果是第二种,那么最好的是:

class MyColor {
int color;
private static final int red_shift = 0;
private static final int green_shift = 8;
private static final int blue_shift = 16;
}

或者有更好的方法吗?

Update:我还将有一个 getRed()、setRed(int)...作为访问器。我只是列出了该类的数据组件以使其更小。和尺寸是这里的关键问题。该代码不会花费大量时间访问这些值,因此性能不是一个大问题。

更新2:我去运行这个使用效用大小 https://code.google.com/p/core-java-performance-examples/source/browse/trunk/src/main/java/com/google/code/java/core/sizeof/SizeofUtil.java(下面引用 - 谢谢)。我使用如下代码完成了此操作:

    protected int create() {
        MyColor[] aa = new MyColor[100000];
        for (int ind=0; ind<100000; ind++)
            aa[ind] = new MyColor2();
        return 2;
    }
}.averageBytes());

这就是事情变得奇怪的地方。首先,如果我不执行 for 循环,因此它仅创建数组(所有值均为空),那么它会报告 400016 字节或 4 字节/数组元素。我使用的是 64 位系统,所以我很惊讶这不是 800000(Java 在 64 位操作系统上有 32 位地址空间吗?)。

但接下来奇怪的部分来了。 for 循环的总数为:

  • 2800016.0
  • 2600008.0
  • 2800016.0

第一个惊喜是,使用 byte[3] 的第二种方法使用更少的内存! JVM 在看到声明中的 byte[3] 后是否有可能只是内联分配它?

其次,每个对象的内存为 (2,800,000 - 400,000) / 100,000 = 24。我将购买第一种方法,其中每个字节都是本机 64 位 int。 3 * 8 字节 = 24 字节。但对于第三种情况,它是一个单一的整数?这是没有意义的。

代码在这里以防万一我错过了一些东西:

package net.windward;

import java.util.Arrays;

public class TestSize {

    public static void main(String[] args) {

        new TestSize().runIt();
    }

    public void runIt() {
        System.out.println("The average memory used by MyColor1  is " + new SizeofUtil() {

            protected int create() {
                MyColor1[] aa = new MyColor1[100000];
                for (int ind = 0; ind < 100000; ind++)
                    aa[ind] = new MyColor1();
                return 1;
            }
        }.averageBytes());

        System.out.println("The average memory used by MyColor2  is " + new SizeofUtil() {

            protected int create() {
                MyColor2[] aa = new MyColor2[100000];
                for (int ind = 0; ind < 100000; ind++)
                    aa[ind] = new MyColor2();
                return 2;
            }
        }.averageBytes());

        System.out.println("The average memory used by MyColor3  is " + new SizeofUtil() {

            protected int create() {
                MyColor3[] aa = new MyColor3[100000];
                for (int ind = 0; ind < 100000; ind++)
                    aa[ind] = new MyColor3();
                return 1;
            }
        }.averageBytes());

        System.out.println("The average memory used by Integer[] is " + new SizeofUtil() {

            protected int create() {
                Integer[] aa = new Integer [100000];
                for (int ind = 0; ind < 100000; ind++)
                    aa[ind] = new Integer(ind);
                return 1;
            }
        }.averageBytes());

    }

    public abstract class SizeofUtil {
        public double averageBytes() {
            int runs = runs();
            double[] sizes = new double[runs];
            int retries = runs / 2;
            final Runtime runtime = Runtime.getRuntime();
            for (int i = 0; i < runs; i++) {
                Thread.yield();
                long used1 = memoryUsed(runtime);
                int number = create();
                long used2 = memoryUsed(runtime);
                double avgSize = (double) (used2 - used1) / number;
//            System.out.println(avgSize);
                if (avgSize < 0) {
                    // GC was performed.
                    i--;
                    if (retries-- < 0)
                        throw new RuntimeException("The eden space is not large enough to hold all the objects.");
                } else if (avgSize == 0) {
                    throw new RuntimeException("Object is not large enough to register, try turning off the TLAB with -XX:-UseTLAB");
                } else {
                    sizes[i] = avgSize;
                }
            }
            Arrays.sort(sizes);
            return sizes[runs / 2];
        }

        protected long memoryUsed(Runtime runtime) {
            return runtime.totalMemory() - runtime.freeMemory();
        }

        protected int runs() {
            return 11;
        }

        protected abstract int create();
    }

    class MyColor1 {
        byte red;
        byte green;
        byte blue;

        MyColor1() {
            red = green = blue = (byte) 255;
        }
    }

    class MyColor2 {
        byte[] color = new byte[3];
        private static final int red = 0;
        private static final int green = 1;
        private static final int blue = 2;

        MyColor2() {
            color[0] = color[1] = color[2] = (byte) 255;
        }
    }

    class MyColor3 {
        int color;
        private static final int red_shift = 0;
        private static final int green_shift = 8;
        private static final int blue_shift = 16;

        MyColor3() {
            color = 0xffffff;
        }
    }
}

从四bytes 适合int,你可以使用一个int适合你的颜色(并且仍然有额外的空间byte如果你想稍后添加,比如说阿尔法)。一小部分方法示例(未经测试,只是为了让您了解想法):

public int toIntColor(byte r, byte g, byte b) {
    int c = (int) r;
    c = (c << 8) | g;
    c = (c << 8) | b;
    return c;
}

并取回字节:

public byte red(int c) {
    return c >> 16 & 0xFF;
}

public byte green(int c) {
    return c >> 8 & 0xFF;
}

public byte blue(int c) {
    return c & 0xFF;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Java 中存储颜色 - byte;byte;byte 与 byte[3] 与 int 的相关文章

随机推荐

  • python排序的空间复杂度是多少?

    python排序需要多少空间复杂度 我在任何地方都找不到这方面的任何明确文档 空间复杂度定义为算法需要多少额外空间N元素 并且尽管根据docs https docs python org 3 library stdtypes html li
  • 无需规则即可创建目标 .moc

    我正在尝试将 ovpn3 的 ovpncli 示例转换为从 QObject 派生的类 我无法将源文件转换为单独的接口 h 和实现 cpp 文件 为了让 MOC 高兴 我把 include openvpn moc 在 openvpn cpp
  • 在 List/ObservableCollection 中维护集合

    我已经成功地将一个项目添加到 MVVM 中的列表中 现在我的问题是在视图模型中维护列表 每次我导航到页面或返回页面并返回到该列表视图时 列表都会重置 我怎样才能做到这一点 我目前正在使用 prism 来构建 MVVM 视图模型 public
  • 如何在 props 中传递 HTML 标签

    我希望能够传递带有 HTML 标签的文本 如下所示
  • 用于缓解 Logjam/weakdh.org 的正确 JBoss EAP 6.0.1 密码套件配置是什么?

    由于堵塞和网站的关注https weakdh org https weakdh org 最近几天收到 Logjam Diffie Hellman 在实践中如何失败 我决定强化 JBoss EAP 6 0 1 系统上的 SSL 配置 如下所述
  • 使用带有无趣回溯的 iOS 4.3 模拟器的 iOS SIGKILL

    只关心我自己的事情 iOS 应用程序在模拟器中运行 没有做任何非常有趣的事情 只是在视图控制器之间移动 然后暂停 然后 KABLAMMO 我立即查看了所有线程的回溯 见下文 但我没有看到任何特别重要的事情 gdb t a a bt Thre
  • 缓存矩阵的逆矩阵

    晚安 我有一个 Coursera 的作业 但我有两天时间试图解决我的问题 我的作业是 编写以下函数 makeCacheMatrix 该函数创建一个特殊的 矩阵 对象 可以缓存其逆矩阵 cacheSolve 该函数计算上面 makeCache
  • 设置 cookie 以在单击按钮时隐藏 div

    我正在尝试显示默认显示的 div 包含条款和条件 除非设置 cookie 来隐藏它 我已将我的代码添加到此处JSFiddle http jsfiddle net v6ddf 有什么想法为什么我的代码不起作用吗 JavaScript func
  • 编译所有子文件夹中的java文件? [复制]

    这个问题在这里已经有答案了 如何使用 javac 编译 Unix 上所有子文件夹中的所有 java 文件 在 Windows 上 创建批处理文件 for r a in do javac a java 然后在顶级源文件夹中执行它 在 Linu
  • 对预检请求的响应未通过访问控制检查:它没有 HTTP 正常状态。获取工作 POST PUT DELETE 不工作

    问候 我有一个具有以下架构的 Web 应用程序 Web api ASP net core 2 1 Windows 身份验证 用户界面 角度8 UI可以获取数据但无法发送数据 我的意思是 GET 方法工作正常 但 POST PUT DELET
  • r 中的 igraph 包:边缘标签重叠

    我正在使用 R 中的 igraph 包来可视化网络流 library igraph Example Data b lt c countryA countryB countryC countryA countryC countryA c lt
  • 动态生成的单选按钮在滚动时更改其位置

    我动态创建了单选按钮 它们显示得很好 但是当我选择并滚动时 它会丢失其位置 我知道使用 ViewHolder 类设置和获取标签并转换 view 的方法 但这一次 我有动态 id 所以我无法标记 id 我试过这样 converview set
  • R magick:方形裁剪和圆形蒙版

    目的是 将任何输入图像转换为正方形长宽比并且 添加圆形蒙版并用白色或透明填充外部 我有 1 个工作要做 但不确定这是最好的方法 这是一个工作示例 library magick path lt https cdn pixabay com ph
  • WKWebView 是否使用 Safari 的 cookie?

    根据苹果文档 cookie 在所有应用程序之间共享 并跨进程边界保持同步 但有这个iOS Note iOS 中的应用程序之间不共享 Cookie 所以基本上我不能在我的应用程序中使用 Safari 的 cookie iOS 安全沙箱禁用应用
  • ZF2 SessionManager 用法

    我是 ZF2 的新手 不太习惯如何做事 我想使用会话来跟踪用户 记住我 我在课堂上有这样的代码 sessionManager new Zend Session SessionManager sessionManager gt remembe
  • 聚合物纸张输入和表格提交

    我正在开发论坛主题并开始使用 Web 组件 但表单元素不起作用 我有这样的东西
  • Mac QuickTime 组件调试

    首先 我是Mac编程的新手 我已经下载了马卡姆项目 http webcam osx sourceforge net index html并使用 Xcode 4 1 成功将调试版本编译为 32 位代码 输出是一个 QuickTime 组件 我
  • 如何读取作为 Blob 文件存储在 Azure 存储中的 Excel 文件

    我想使用 C 中的 Epplus 包读取作为 Blob 存储在 Azure 存储容器中的 Excel 文件 我尝试用这段代码做一些事情 string uri blob Uri AbsoluteUri FileInfo fileInfo ne
  • 如何在 CLR 存储过程中使用实体框架?

    我期待将所有逻辑 作为操作 Entity Framework 4 对象实现 移至服务器端 它看起来会很简单 由于应用程序结构 并且有益 因为我只有一台旧笔记本电脑作为客户端和一台运行 SQL Server 2008 的强大服务器 并且为逻辑
  • 在 Java 中存储颜色 - byte;byte;byte 与 byte[3] 与 int

    我需要存储大量 RGB 颜色对象 对于一些常见用途 它们占用了我的应用程序总内存的 8 到 12 我目前将其定义如下 class MyColor byte red byte green byte blue 我假设 大多数 JVM 实际上对每