Search
Write a publication
Pull to refresh

Comments 9

Очень интересная фишка и ждем давно. Правда для себя еще не решил, стоит ли "щупать", пока не вышло с инкубатора или нет.

Надеюсь они еще все же сделают, чтобы интерфейсы native в GraalVM и в Panama были одним и тем же.

Как будет работать не знаю, надо пробовать, но альтернатива багу есть:

По опыту 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. В теории они должны прекрасно друг другу подойти.

Я так понимаю, что Грааль не видит API в инкубаторе и падает с UnresolvedElementException

Я не собирал инкубатор под Грааль.

Но достаточно посмотреть на JavaDoc из инкубатора и из Грааль тут и тут, чтобы понять, что API пошли разными путями.

Sign up to leave a comment.

Articles