Thread LZ4 Kompression zwischen JS und Perl (Kompatibilitätsproblem?) (21 answers)
Opened by styx-cc at 2020-04-19 01:22

Gustl
 2020-04-19 18:23
#191747 #191747
User since
2011-01-27
441 Artikel
BenutzerIn
[Homepage]
user image
Hallo,

also ich habe mich jetzt auch ein bisschen mehr damit beschäftigt, und muss sagen, dass man das bei mehreren Datenmengen auch unter 5mb bemerkt. Habe es allerdings nur mit gzip erfolgreich testen können.

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
<html>
<head>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
<script src="jsxcomperssor.min.js"></script>
</head>
<body>

<button id="btn_compress">GET DATA WITH COMPRESS</button>
<button id="btn_no_compress">GET DATA WITHOUT COMPRESS</button>

<p id="output"></p>
<p id="size"></p>

<script>


$("#btn_compress").click(function(){
get_data(1);
});

$("#btn_no_compress").click(function(){
get_data(0);
});

function get_data( compress ){
let c = 0
if( compress == 1 ){
c = 1
}

var ajaxTime= new Date().getTime();
$.ajax({url: "http://dev.j-haefner.de/compress/data.pl?compress=" + c, success: function(result){
var totalTime = new Date().getTime()-ajaxTime;
if( compress == 1 ){
var jsonstr = JXG.decompress(result);
var json = JSON.parse(jsonstr);
$("#output").html("COMPRESS - " + totalTime + " ms - " + json.checkstring);
}
else{
$("#output").html("NO COMPRESS - " + totalTime + " ms - " + result.checkstring);
}
}});
}
</script>
</body>
</html>


Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#!/usr/bin/perl -w
use strict;
use warnings;

use CGI;
use CGI::Carp qw(fatalsToBrowser);
use lib 'module';
use WebDB;
use JSON; 
use IO::Compress::Gzip qw(gzip $GzipError);
#use IO::Uncompress::Gunzip qw(gunzip $GunzipError); 
use MIME::Base64;

my $cgi = new CGI;
my $compress = $cgi->param("compress");

my $result;
my $result->{checkstring} = "Mein Teststring.";

my @array = WebDB::get_hasharray("SELECT * FROM exercises");
$result->{data} = \@array;
my $json = to_json($result, {pretty => 1});

my $output;
my $unziped;
if( $compress ){
  print $cgi->header( -type=>'application/octet-stream', -encoding=>'gzip' );
  #print $cgi->header( -type=>'text/plain', -encoding=>'gzip' ); 
  gzip \$json, \$output, or die "gzip failed: $GzipError\n";
  $output = encode_base64($output);
  #gunzip \$output, \$unziped, or die "gzip failed: $GzipError\n";
}
else{
  print $cgi->header( -type=>'application/json' ); 
  $output = $json;
}
 
print $output; 


Mit Komprimierung sind es 460 KB und 520ms
Ohne Komprimierung sind es 6 MB und 1200ms

Das ist ein super Performance schub und den werde ich in Zukunft in meinen Projekten einfließen lassen. Danke. :)

Mit LZ4 habe ich auch lange probiert, leider jedoch auch ohne Erfolg.
komisch kommt mir das Ergebnis vor was Perl hier im Response zurückliefert.

Ich habe folgendes aus Link: https://github.com/pierrec/node-lz4 getestet:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<script type="text/javascript" src="/path/to/lz4.js"></script>
<script type="text/javascript">
// Nodejs-like Buffer built-in
var Buffer = require('buffer').Buffer
var LZ4 = require('lz4')

// Some data to be compressed
var data = 'Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.'
data += data
// LZ4 can only work on Buffers
var input = new Buffer(data)
// Initialize the output buffer to its maximum length based on the input data
var output = new Buffer( LZ4.encodeBound(input.length) )

// block compression (no archive format)
var compressedSize = LZ4.encodeBlock(input, output)
// remove unnecessary bytes
output = output.slice(0, compressedSize)

console.log( "compressed data", output )

// block decompression (no archive format)
var uncompressed = new Buffer(input.length)
var uncompressedSize = LZ4.decodeBlock(output, uncompressed)
uncompressed = uncompressed.slice(0, uncompressedSize)

console.log( "uncompressed data", uncompressed )
</script>


Und wenn man sich mal output in der Console anschaut, ist das ja nicht das was perl für den selben string (data) liefert.!?

Vielleicht liegt da der Hund begraben.

Ich probiere noch weiter. Wäre super wenn du hier auch die Lösung posten würdest wenn du eine hast. :)

Vielen Dank und viele Grüße
Last edited: 2020-04-19 19:13:14 +0200 (CEST)

View full thread LZ4 Kompression zwischen JS und Perl (Kompatibilitätsproblem?)