Francois As already pointed out Jena relies on a 3rd party library (java-jsonld) for JSON-LD support so performance is limited by 1) the need to translate Jena's data structures into data structures the java-jsonld understands and 2) the actual serialisation performance of the java-jsonld library
Neither of which Jena can do anything about ourselves, you may wish to consider filing an issue with that library at https://github.com/jsonld-java/jsonld-java Rob On 22/11/2015 14:17, "François-Paul Servant" <[email protected]> wrote: >Andy, > >I improved my test (running on the same file): several runs, RDFFormats >variations… Results and code below (SSD disk, otherwise 5 years old mac >powerbook) >Main fact remains: JSON-LD serialization is slow (~10 times slower than >turtle). But people want JSON-LD. I think I’ll have a look at javascript >to convert turtle to JSON-LD in the browser. > >Best Regards, > >fps > >model.size() 7559 >*** WARM-UP *** >JSON-LD/pretty TIME: 766 ms >JSON-LD/flat TIME: 563 ms >N-Triples/utf-8 TIME: 80 ms >RDF/XML/pretty TIME: 560 ms >RDF/XML/plain TIME: 227 ms >RDF/XML/pretty TIME: 518 ms >Turtle/blocks TIME: 120 ms >Turtle/flat TIME: 142 ms >Turtle/pretty TIME: 110 ms >N-Triples/utf-8 TIME: 50 ms >*** RESULTS *** >JSON-LD/pretty TIME: 497 ms >JSON-LD/flat TIME: 475 ms >N-Triples/utf-8 TIME: 31 ms >RDF/XML/pretty TIME: 253 ms >RDF/XML/plain TIME: 140 ms >RDF/XML/pretty TIME: 215 ms >Turtle/blocks TIME: 50 ms >Turtle/flat TIME: 46 ms >Turtle/pretty TIME: 52 ms >N-Triples/utf-8 TIME: 34 ms > > >package testperfs; > >import java.io.BufferedInputStream; >import java.io.BufferedOutputStream; >import java.io.File; >import java.io.FileInputStream; >import java.io.FileOutputStream; >import java.io.IOException; >import java.io.InputStream; >import java.io.OutputStream; >import java.net.URL; > >import org.apache.jena.rdf.model.Model; >import org.apache.jena.rdf.model.ModelFactory; >import org.apache.jena.riot.RDFDataMgr; >import org.apache.jena.riot.RDFFormat; >import org.junit.After; >import org.junit.AfterClass; >import org.junit.Before; >import org.junit.BeforeClass; >import org.junit.Test; > >public class serialization { > >@BeforeClass >public static void setUpBeforeClass() throws Exception { >} > >@AfterClass >public static void tearDownAfterClass() throws Exception { >} > >@Before >public void setUp() throws Exception { >} > >@After >public void tearDown() throws Exception { >} > >@Test >public final void test() throws IOException { > Model m = loadModel(); > System.out.println("model.size() " + m.size()); > > RDFFormat[] formats = { > RDFFormat.JSONLD_PRETTY, > RDFFormat.JSONLD_FLAT, > RDFFormat.NTRIPLES_UTF8, > RDFFormat.RDFXML_ABBREV, > RDFFormat.RDFXML_PLAIN, > RDFFormat.RDFXML_PRETTY, > RDFFormat.TURTLE_BLOCKS, > RDFFormat.TURTLE_FLAT, > RDFFormat.TURTLE_PRETTY, > RDFFormat.NTRIPLES_UTF8}; > > // warm it up > System.out.println("*** WARM-UP ***"); > for (RDFFormat format : formats) { > doIt(m, format, 1); > } > > // now for real > System.out.println("*** RESULTS ***"); > for (RDFFormat format : formats) { > doIt(m, format, 20); > } >} > >private void doIt(Model m, RDFFormat format, int n) throws IOException { > File f = new File(getFile("/testperfs"),"output.txt"); > > long time = 0; > for (int i = 0 ; i < n ; i++) { > if (f.exists()) f.delete(); > OutputStream out = new BufferedOutputStream(new > FileOutputStream(f)); > long start = System.currentTimeMillis(); > RDFDataMgr.write(out, m, format) ; > out.flush(); > out.close(); > long end = System.currentTimeMillis(); > time += (end-start); > } > String x = format + " TIME: " + time/n + " ms"; > System.out.println(x); >} > > >private void doItOld(Model m, String lang) throws IOException { > File f = new File(getFile("/testperfs"),"output.txt"); > if (f.exists()) f.delete(); > OutputStream out = new BufferedOutputStream(new FileOutputStream(f)); > long start = System.currentTimeMillis(); > m.write(out, lang); > out.flush(); > out.close(); > long end = System.currentTimeMillis(); > String x = lang + " TIME: " + (end-start) + " ms"; > System.out.println(x); > f.delete(); >} > >private Model loadModel() throws IOException { > Model m = ModelFactory.createDefaultModel(); > // Loading the model > File f = getTestFile(); > InputStream in = new BufferedInputStream(new FileInputStream(f)); > m.read(in, null, "JSON-LD"); > in.close(); > return m; >} > >private File getTestFile() { > return getFile("/testperfs/docs.jsonld"); >} > >private File getFile(String name) { > URL resourceUrl = getClass().getResource(name); > return new File(resourceUrl.getFile()); >} > > >} > > >> Le 21 nov. 2015 à 18:06, Andy Seaborne <[email protected]> a écrit : >> >> On 21/11/15 01:28, François-Paul Servant wrote: >>> Hi, >>> >>> it seems to me that JSON-LD serialization is slow. Do you have the >>>same feeling? >>> Here are the results of a comparative test that I run on my machine >>>(outputing one model to a file, using Jena 3.0.1-SNAPSHOT) >>> >> >> Are these single run costs? i.e. from cold? >> >>> model.size() 7559 >>> JSON-LD TIME: 649 ms >> >> Jena use a separate self-contained engine, jsonld-java, which in trun >>uses Jackson. >> >> It means taking a copy of much of the material to be printed, getting >>an in-memory structure then traversing it for output, including >>formatting the JSON so it is not all on one line and JSON-indented. >> >>> TURTLE TIME: 136 ms >> >> That is the normal Turtle writer? It's pretty printing and so >>non-streaming - there are variations (RDFFormat) to printing streaming >>style with less prettiness but still using prefixed names. Pretty is >>not free. >> >>> RDF/XML TIME: 548 ms >> >> Ditto - RDF/XML or RDF/XML-ABBREV. The default using RDFDataMgr for >>Loang.RDFXML is "pretty" (RDF/XML-ABBREV) >> >>> N-TRIPLE TIME: 61 ms >> >> Is that to a spinning disk or SSD? (Given a disk write inc sync is of >>the order of 10ms) >> >> Andy >> >>> >>> annoying... >>> >>> Best, >>> >>> fps >>> >> >
