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
>>> 
>> 
>




Reply via email to