从包中读取数据是否比从硬盘驱动器上的文件夹读取数据慢?

Is read data from the package slower than reading from a folder on your hard drive?

我有一个对象,我想在启动程序时将其加载到内存中。 我的问题是: 是把对象插入到(JAR)包里还是和程序放在文件夹里比较好?

读取对象的更快方法是什么?

编辑:

    public MapStandard loadFromFileMS(String nameOfFile) {

        MapStandard hm = null;
/*
        InputStream inputStreaminputStream
                = getClass().getClassLoader().
                getResourceAsStream("data/" + nameOfFile + ".data");
*/
        try {
             FileInputStream inputStreaminputStream = new FileInputStream("C:\"+nameOfFile+".data");
            try (ObjectInputStream is = new ObjectInputStream(inputStreaminputStream)) {
                hm = (MapStandard) is.readObject();
            }
        } catch (IOException | ClassNotFoundException e) {
            System.out.println("Error: " + e);
        }
        return hm;

    }

理论上从目录读取文件比从 JAR 文件读取文件更快。 JAR 文件基本上是带有一些元数据 (MANIFEST.MF) 的 zip 文件,因此从 JAR 读取将包括解压缩内容。

我认为没有明确的答案。当然,读取压缩档案需要时间来解压缩。但是:CPU 周期非常便宜。读取较小的存档并提取其内容所花费的时间可能仍然比直接从文件系统读取 "much more" 内容更快。您可以在等待 IO 进入时进行大量计算。

另一方面:你真的认为这个文件的加载是性能瓶颈吗?

俗话说万恶之源是过早的优化。 如果您或您的用户抱怨性能不佳——那么您才开始分析您的应用程序;例如使用分析器。然后你就可以开始修复那些真正导致问题的性能问题;不是那些你 "assume" 有问题的。

最后:如果我们谈论的是这么大的维度——那么你不应该征求 Whosebug 的意见,而是开始自己测量准确的时间!我们只能假设 - 但您拥有所有数据 - 您只需要收集它!

一个合格的猜测是,当程序 启动时 jar 文件条目将加载一个 lot 比外部文件快,但重复使用会更相似。

原因是现代计算机的限制因素是 "How fast can the bytes be retrieved from disk" 并且对于 jar 文件,JVM 已经读取了 zip 文件,因此许多需要的字节已经加载并且没有再次阅读。外部文件需要与操作系统完全独立的 "open-read" 舞蹈。以后两者都会在操作系统维护的磁盘读取缓存中,所以差异可以忽略不计。

关于 cpu 用法的考虑并不是真正必要的。现代 CPU 可以在从磁盘读取额外数据所需的时间内进行大量解压缩。

请注意,读取 jar 文件会使其自动写保护。如果您需要更新内容,您需要一个外部文件。