Skip to content

Instantly share code, notes, and snippets.

@carl-mastrangelo
Last active May 31, 2020 21:36
Show Gist options
  • Save carl-mastrangelo/0491cbac62e77ae17509546b87fae5b1 to your computer and use it in GitHub Desktop.
Save carl-mastrangelo/0491cbac62e77ae17509546b87fae5b1 to your computer and use it in GitHub Desktop.
Project Panama
#include <stdlib.h>

void * jmalloc(size_t size) {
  return malloc(size);
}

void jfree(void * ptr) {
  free(ptr);
}


void noop(void) {}
#include <stddef.h>

extern void * jmalloc(size_t size);

extern void jfree(void * ptr);

extern void noop(void);

Commands

  • gcc mlc.c -shared -fPIC -o libjmalloc.so
  • bin/jextract -t my.test mlc.h -L . -ljmalloc --record-library-path -o mytest.jar
  • bin/javac -cp mytest.jar Main.java
  • bin/java -cp mytest.jar:. Main
import my.test.mlc_lib;

import static my.test.mlc_lib.jmalloc;
import static my.test.mlc_lib.jfree;
import static my.test.mlc_lib.noop;


public class Main {
    public static void main(String[] args) {
        try (java.foreign.Scope s = mlc_lib.scope().fork()) {
            Object o = jmalloc(1L);
            
            for (int i = 1; i < 60; i++) {
              long iter = i * 10_000_000L;
              long start = System.nanoTime();
            
              run(iter);
              long stop = System.nanoTime();
              long dur = stop - start;
              double rate  = ((double) dur) / ((double) iter);
              System.err.println("did " + iter + " in " + (stop - start) + " " + rate);
            }
        }
    }
    
    
    private static void run(long iter) {
      for (long i = 0; i < iter; i++) {
        //noop();
        java.foreign.memory.Pointer<java.lang.Void> d = jmalloc(1);
        jfree(d);
      }
    }
}
# noop
$ bin/java -cp mytest.jar:. Main
did 100000000 in 1109161727 11.09161727
did 200000000 in 2119229893 10.596149465
did 300000000 in 3184463047 10.614876823333333
did 400000000 in 4224329521 10.5608238025
did 500000000 in 5263623427 10.527246854
did 600000000 in 6340415715 10.567359525
did 700000000 in 7501951303 10.71707329
did 800000000 in 8545650314 10.6820628925
did 900000000 in 9569527001 10.632807778888889
did 1000000000 in 10656708424 10.656708424
did 1100000000 in 11731976309 10.665433008181818

# free + malloc
$ bin/javac -cp mytest.jar  Main.java 
$ bin/java -cp mytest.jar:. Main
did 10000000 in 397513548 39.7513548
did 20000000 in 734786864 36.7393432
did 30000000 in 1076614519 35.887150633333334
did 40000000 in 1423214579 35.580364475
did 50000000 in 1800407908 36.00815816
did 60000000 in 2130245137 35.504085616666664
did 70000000 in 2490184003 35.57405718571429
did 80000000 in 2879956556 35.99945695
did 90000000 in 3218278524 35.75865026666666
did 100000000 in 3561557064 35.61557064
did 110000000 in 3921791593 35.652650845454545
did 120000000 in 4284761434 35.706345283333334

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment