小编Unm*_*yer的帖子

为什么String.equals()比自身更快?

我试图创建一个更快版本的String.equals()方法,并通过简单地复制它开始.我发现的结果非常令人困惑.当我运行复制粘贴版本,定时并将其与JVM版本进行比较时,JVM版本更快.差异从6倍到34倍不等!简单地说,字符串越长,差异就越大.

boolean equals(final char a[], final char b[]) {
    int n = a.length;
    int i = 0;

    while (n-- != 0) {
        if (a[i] != b[i]) return false;
        i++;
    }
    return true;
}

public static void main() throws Exception {
    String a = "blah balh balh";
    String b = "blah balh balb";

    long me = 0, jvm = 0;

    Field value = String.class.getDeclaredField("value");
    value.setAccessible(true);

    final char lhs[] = (char[]) value.get(a);
    final char rhs[] = (char[]) value.get(b);
    for (int …
Run Code Online (Sandbox Code Playgroud)

java optimization

16
推荐指数
1
解决办法
1163
查看次数

迭代文件列表的有效方法

我正在寻找一种有效的方法来迭代一个或多个目录中的数千个文件.

迭代目录中文件的唯一方法似乎是File.list*()函数.这些函数有效地加载某种Collection中的整个文件列表,然后让用户迭代它.就时间/内存消耗而言,这似乎是不切实际的.我试着看看commons-io和其他类似的工具.但他们最终都File.list*()在里面打电话.JDK7已walkFileTree()接近尾声,但我无法控制何时选择下一个元素.

我在一个目录中有超过150,000个文件,经过多次-Xms/-Xmm试运行后,我摆脱了内存溢出问题.但是填充阵列所需的时间并没有改变.

我希望创建一些Iterable类,它使用opendir()/ closedir()函数来根据需要延迟加载文件名.有没有办法做到这一点?

更新:

Java 7 NIO.2通过java.nio.file.DirectoryStream支持文件迭代.这是一个Iterable类.至于JDK6及以下版本,唯一的选择是File.list*()方法.

java

8
推荐指数
1
解决办法
4103
查看次数

静态链接libc的正确方法是什么?

我在这里和其他论坛上看到了很多问题,其中建议使用编译参数-static,有时甚至-static -static-libgcc与编译参数一起使用。这在 Alpine 上不起作用,但在 Ubuntu 和 Fedora 上工作得很好。

我用 C 语言编写了一个简单的 hello-world 程序,然后将其编译为gcc -static test.c. 生成的二进制文件仍然亮起ldd。看,

$ gcc -s test.c -static
$ ldd ./a.out
    /lib/ld-musl-x86_64.so.1 (0x7f043eae8000)

$ file ./a.out
./a.out: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, stripped
Run Code Online (Sandbox Code Playgroud)

在 Ubuntu 上运行相同的命令显示:

$ gcc -s test.c -static                   
$ file ./a.out 
./a.out: ELF 64-bit LSB executable, x86-64, version 1 (GNU/Linux), statically linked, for GNU/Linux 3.2.0, BuildID[sha1]=bf6bfa1c78c541ae4e81586bcd050923bca9e34a, stripped
Run Code Online (Sandbox Code Playgroud)

在任何平台上静态链接 libc 本身的正确且一致的方法是什么?这与 …

linker gcc

8
推荐指数
2
解决办法
8230
查看次数

自定义Linux安装程序

是否有可能创建一个自定义Linux安装程序,允许我选择一个非常小的安装,其中包括内核,引导加载程序,基本网络/核心功能,shell和我自己的一些C++/Java熟练应用程序.

我正在使用几台旧计算机设置一个小型集群.我可能不得不经常删除/重新创建分区并修改我的应用程序设置以符合我的要求.

我尝试了Ubuntu和Fedora,甚至还使用了他们的重新制作工具.问题是他们最终安装了不需要我工作的软件包,更糟糕的是他们实际上在启动时启动了.目前,我有脚本必须下载到这些机器上才能进行"清理"工作.

我甚至看过LFS(Scratch的Linux).这只是我需要的东西,但它没有相关的安装程序.用于自动化LFS安装的工具(如nALFS和jhalfs)没有良好的文档,并且不适用于此类工作.

如果我可以制作一个安装程序iso文件,它会在第一次运行时完成所有操作,即在安装linux时,这将是非常好的.是否可以创建这样的Linux安装程序?有没有这样的现成工具?

linux

6
推荐指数
1
解决办法
4834
查看次数

如何在交叉编译环境中检测libc名称和版本?

我的 Linux 桌面上有一些交叉编译器。有些使用 glibc,有些使用 uclibc(将来也可能有其他libc)。

目前,我可以进入他们的 sysroot 目录并搜索libc.so并尝试找到它指向的文件名(例如libc.so-> libuClibc-1.0.12.so),然后我获取他们的名称。但如果命名发生变化或者交叉编译器本身发生变化,这种情况不会持续太久。

是否有更好/可靠的编程方法来检测libc目标交叉编译器所使用的名称和版本?或者是否有任何内省工具可用于获取有关目标 ceros 的详细信息

注意:这里有一些类似的问题,通常指向#include <features.h>文件或类似问题。如果生成的代码也可以在主机上运行,​​那么效果很好。但不适合交叉编译环境。

那么有人能够更可靠地检测到吗?

编辑:如果有人来这里专门寻找检测 musl libc,我已经回答了与此问题相关的另一个问题。

c

3
推荐指数
1
解决办法
2280
查看次数

标签 统计

java ×2

c ×1

gcc ×1

linker ×1

linux ×1

optimization ×1