Comments 9
Очень интересная фишка и ждем давно. Правда для себя еще не решил, стоит ли "щупать", пока не вышло с инкубатора или нет.
Надеюсь они еще все же сделают, чтобы интерфейсы native в GraalVM и в Panama были одним и тем же.
Интересно как будет работать MemorySegment.mapFile
и MemorySegment.ofByteBuffer
?
Насколько я знаю MappedByteBuffer
так и не починили, теперь появится альтернатива?
Как будет работать не знаю, надо пробовать, но альтернатива багу есть:
По опыту Graal Native и Java Native Access - просто идем в POSIX, дергаем open/read метод, куда передаем указатель и получаем результат.
Судя по API что-то примерно такое (код не проверял, смотрел по спекам):
MethodHandle open = CLinker.getInstance().downcallHandle(
LibraryLookup.ofDefault().lookup("open").get(),
MethodType.methodType(MemoryAddress.class, int.class);
int fd = open.invoke(CLinker.toCString("/tmp/file.txt").address(), 0);
MemorySegment ms = MemorySegment.allocateNative(1000);
MethodHandle read = CLinker.getInstance().downcallHandle(
LibraryLookup.ofDefault().lookup("read").get(),
MethodType.methodType(int.class, MemoryAddress.class, int.class);
read.invoke(fd, ms.address(), 1000);
ByteBuffer buf = ms.asByteBuffer();
Ну понятно, что все эти танцы с бубнами можно в свои методы один раз обернуть.
Подход понятен, осталось сделать close и поддержку под Windows, etc :)
Ну типа того... :)
Хотя вот я тут ради интереса померял запись/чтение в random место в файл на 1GB блоков в 64kb, пока результат заставляет задуматься(либо я не то мерял)...
java.io randomRead thrpt 31135.552 ops/s
java.nio randomRead thrpt 993593.599 ops/s
JNA randomRead thrpt 28888.787 ops/s
java.io randomWrite thrpt 17482.929 ops/s
java.nio randomWrite thrpt 1039483.908 ops/s
JNA randomWrite thrpt 16280.924 ops/s
На выходных попробую Linix AIO подергать в JNA и native ради интереса. посмотреть какие результаты будут.
Ну в принципе что-то подобное я попробовал https://github.com/kofemann/vfs4j/blob/master/src/main/java/org/dcache/vfs4j/LocalVFS.java.
В 17 работает хорошо. В 16 иногда ВМ падала. Native image с GraalVM создать не удалось. У продакшен пока рановато. В 18 ожидаются изменения в API. Но играться уже можно.
П.С. Спасибо автору за статью. Сам хотел написать, но автор был быстее
Native image с GraalVM создать не удалось
Что именно не удалось? Откомпилять этот код в Грааль или написать под Грааль? Там сейчас разное API. Судя по коду, под грааль это вполне реализуемо, если интересно, пишите в личку, поделюсь опытом.
P.S. Я сейчас как раз подумываю по этой теме скрестить Vertx.fileSystem и AIO под JVM/GraalMode. В теории они должны прекрасно друг другу подойти.
Java 17: Foreign Functions & Memory API