我试图创建一个更快版本的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) 我正在寻找一种有效的方法来迭代一个或多个目录中的数千个文件.
迭代目录中文件的唯一方法似乎是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*()
方法.
我在这里和其他论坛上看到了很多问题,其中建议使用编译参数-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 本身的正确且一致的方法是什么?这与 …
是否有可能创建一个自定义Linux安装程序,允许我选择一个非常小的安装,其中包括内核,引导加载程序,基本网络/核心功能,shell和我自己的一些C++/Java熟练应用程序.
我正在使用几台旧计算机设置一个小型集群.我可能不得不经常删除/重新创建分区并修改我的应用程序设置以符合我的要求.
我尝试了Ubuntu和Fedora,甚至还使用了他们的重新制作工具.问题是他们最终安装了不需要我工作的软件包,更糟糕的是他们实际上在启动时启动了.目前,我有脚本必须下载到这些机器上才能进行"清理"工作.
我甚至看过LFS(Scratch的Linux).这只是我需要的东西,但它没有相关的安装程序.用于自动化LFS安装的工具(如nALFS和jhalfs)没有良好的文档,并且不适用于此类工作.
如果我可以制作一个安装程序iso文件,它会在第一次运行时完成所有操作,即在安装linux时,这将是非常好的.是否可以创建这样的Linux安装程序?有没有这样的现成工具?
我的 Linux 桌面上有一些交叉编译器。有些使用 glibc,有些使用 uclibc(将来也可能有其他libc
)。
目前,我可以进入他们的 sysroot 目录并搜索libc.so
并尝试找到它指向的文件名(例如libc.so
-> libuClibc-1.0.12.so
),然后我获取他们的名称。但如果命名发生变化或者交叉编译器本身发生变化,这种情况不会持续太久。
是否有更好/可靠的编程方法来检测libc
目标交叉编译器所使用的名称和版本?或者是否有任何内省工具可用于获取有关目标 ceros 的详细信息
注意:这里有一些类似的问题,通常指向#include <features.h>
文件或类似问题。如果生成的代码也可以在主机上运行,那么效果很好。但不适合交叉编译环境。
那么有人能够更可靠地检测到吗?
编辑:如果有人来这里专门寻找检测 musl libc,我已经回答了与此问题相关的另一个问题。