Files
XRLib/Assets/ADL-Plugins/benchmark/Scripts/benchmark.cs
2025-06-04 23:10:11 +09:00

307 lines
13 KiB
C#

using UnityEngine;
using System;
using System.Threading;
using System.IO;
using System.Collections;
using System.Collections.Generic;
public class benchmark : MonoBehaviour{
#if (!UNITY_WEBPLAYER && !UNITY_WEBGL && !UNITY_TVOS) || UNITY_EDITOR
private int lzres = 0, zipres = 0, flzres = 0;
private int brres = 0, lz4res = 0, gzres = 0;
private bool pass1, pass2;
//for counting the time taken to decompress the 7z file.
private float t1, tim;
//the test file to download.
private string myFile = "testimg2.7z", myFile2 = "testimg.zip", uncFile = "testimg.tif";
//the adress from where we download our test file
private string uri = "https://dl.dropbox.com/s/5r7tlkvff9ba04b/";
private string ppath;
private string log="";
private bool downloadDone, benchmarkStarted;
private long tsize;
GUIStyle style;
//A 1 item integer array to get the current extracted file of the 7z archive. Compare this to the total number of the files to get the progress %.
private int[] progress = new int[1];
private ulong[] progress1 = new ulong[1];
private ulong[] progress2 = new ulong[1];
private float[] progress3 = new float[1];
private ulong[] progress4 = new ulong[1];
private ulong[] bytes = new ulong[1];
private ulong[] gzProgress = new ulong[1];
void Start(){
ppath = Application.persistentDataPath;
//we are setting the lzma.persitentDataPath so the get7zinfo, get7zSize, decode2Buffer functions can work on separate threads!
lzma.persitentDataPath = Application.persistentDataPath;
#if UNITY_STANDALONE_OSX && !UNITY_EDITOR
ppath=".";
#endif
Screen.sleepTimeout = SleepTimeout.NeverSleep;
if (!File.Exists(ppath + "/" + myFile)) StartCoroutine(Download7ZFile()); else downloadDone = true;
benchmarkStarted = false;
style = new GUIStyle ();
style.richText = true;
GUI.color = Color.black;
}
void Update(){
if (Input.GetKeyDown(KeyCode.Escape)) { Application.Quit(); }
}
void OnGUI(){
if (downloadDone){
if(!benchmarkStarted) {
if (GUI.Button(new Rect(10, 10, 170, 50), "start Benchmark (48 mb)")){
benchmarkStarted = true;
log = "";
lzres = 0; zipres = 0; flzres = 0; lz4res = 0;
StartCoroutine(decompressFunc());
}
}
}
GUI.TextArea(new Rect(10, 70, Screen.width - 20, Screen.height - 190), log,style);
}
//call from separate thread. here you can get the progress of the extracted files through a referenced integer.
IEnumerator decompressFunc(){
System.IO.FileInfo fio;
fio = new FileInfo(ppath + "/testimg2.7z");
//decompress 7zip
log += "<color=lime>decompressing 7zip ... <color=yellow>(" + ((float)fio.Length/1024).ToString("F")+ " kb)</color></color>";
t1 = Time.realtimeSinceStartup;
lzres = lzma.doDecompress7zip(ppath + "/"+myFile , ppath + "/", true,true);
log += " <color=white>(" + lzma.getBytesWritten().ToString() + ")\n</color>";
tim = Time.realtimeSinceStartup - t1;
log += "<color=white>status: "+ lzres + " | 7z time: </color>" + "<color=cyan>"+ tim + " sec</color>\n\n";
log += "<color=orange>compressing lzma ... </color>";
yield return true;
//compress lzma alone
t1 = Time.realtimeSinceStartup;
lzma.setProps(9, 1 << 16);
if(File.Exists(ppath +"/"+ uncFile+".lzma")) File.Delete(ppath +"/"+ uncFile+".lzma");
lzres = lzma.LzmaUtilEncode( ppath +"/"+ uncFile, ppath +"/"+ uncFile+".lzma");
log += "<color=white>(" + lzma.getBytesRead().ToString() + ")\n</color>";
tim = Time.realtimeSinceStartup - t1;
fio = new FileInfo(ppath + "/" + uncFile + ".lzma");
log += "<color=white>status: "+ lzres +" | lzma time: </color>" + "<color=teal>" + tim + " sec</color> <color=yellow>(" + ((float)fio.Length / 1024).ToString("F") + " kb)</color>\n\n";
log += "<color=lime>decompressing lzma alone ... </color>";
yield return true;
//decompress lzma alone
t1 = Time.realtimeSinceStartup;
lzres = lzma.LzmaUtilDecode(ppath + "/" + uncFile + ".lzma", ppath + "/" + uncFile );
log += "<color=white>(" + lzma.getBytesWritten().ToString() + ")\n</color>";
tim = Time.realtimeSinceStartup - t1;
log += "<color=white>status: " + lzres + " | lzma time: </color>" + "<color=cyan>" + tim + " sec</color>\n\n";
log += "<color=orange>compressing zip ... </color>";
yield return true;
//compress zip
t1 = Time.realtimeSinceStartup;
if(File.Exists(ppath + "/"+myFile2)) File.Delete(ppath + "/"+myFile2);
progress1[0] = 0;
zipres = lzip.compress_File(9, ppath + "/"+myFile2, ppath + "/"+uncFile, false, null, null, null, false, 0, progress1);
log += "<color=white>(" + progress1[0].ToString() + ")\n</color>";
tim = Time.realtimeSinceStartup - t1;
fio = new FileInfo(ppath + "/" + myFile2);
log += "<color=white>status: "+ zipres + " | zip time: </color>" + "<color=teal>" + tim + " sec</color> <color=yellow>(" + ((float)fio.Length / 1024).ToString("F") + " kb)</color>\n\n";
log += "<color=lime>decompressing zip ... </color>";
yield return true;
//decompress zip
t1 = Time.realtimeSinceStartup;
zipres = lzip.decompress_File(ppath + "/"+myFile2, ppath+"/", progress, null, progress1);
log += "<color=white>(" + progress1[0].ToString() + ")\n</color>";
tim = Time.realtimeSinceStartup - t1;
log += "<color=white>status: "+ zipres + " | zip time: </color>" + "<color=cyan>" + tim + " sec</color>\n\n";
#if (!UNITY_EDITOR_OSX && !UNITY_STANDALONE_OSX && !UNITY_IOS && !UNITY_TVOS) || (UNITY_EDITOR && !UNITY_EDITOR_OSX)
log += "<color=orange>Compressing to zip-bz2 ... </color>";
yield return true;
//compress zip-bz2
t1 = Time.realtimeSinceStartup;
if(File.Exists(ppath + "/"+myFile2+"bz2.zip")) File.Delete(ppath + "/"+myFile2+"bz2.zip");
progress1[0] = 0;
zipres = lzip.compress_File(9, ppath + "/"+myFile2+"bz2.zip", ppath + "/"+uncFile, false, null, null, null, true, 0, progress1);
log += "<color=white>(" + progress1[0].ToString() + ")\n</color>";
tim = Time.realtimeSinceStartup - t1;
fio = new FileInfo(ppath + "/" + myFile2+"bz2.zip");
log += "<color=white>status: "+ zipres + " | zip-bz2 time: </color>" + "<color=teal>" + tim + " sec</color> <color=yellow>(" + ((float)fio.Length / 1024).ToString("F") + " kb)</color>\n\n";
log += "<color=lime>decompressing zip-bz2 ... </color>";
yield return true;
//decompress zip-bz2
t1 = Time.realtimeSinceStartup;
zipres = lzip.decompress_File(ppath + "/"+myFile2+"bz2.zip", ppath+"/", progress, null, progress1);
log += "<color=white>(" + progress1[0].ToString() + ")\n</color>";
tim = Time.realtimeSinceStartup - t1;
log += "<color=white>status: "+ zipres + " | zip-bz2 time: </color>" + "<color=cyan>" + tim + " sec</color>\n\n";
#endif
log += "<color=orange>Compressing to flz ... </color>";
yield return true;
//compress flz
t1 = Time.realtimeSinceStartup;
flzres = fLZ.compressFile(ppath+ "/" + uncFile, ppath + "/" + uncFile + ".flz", 2, true, progress2);
log += "<color=white>(" + progress2[0].ToString() + ")\n</color>";
tim = Time.realtimeSinceStartup - t1;
fio = new FileInfo(ppath + "/" + uncFile + ".flz");
log += "<color=white>status: "+ flzres + " | flz time: </color>" + "<color=teal>" + tim + " sec</color> <color=yellow>(" + ((float)fio.Length / 1024).ToString("F") + " kb)</color>\n\n";
log += "<color=lime>Decompressing flz ... </color>";
yield return true;
//decompress flz
t1 = Time.realtimeSinceStartup;
flzres = fLZ.decompressFile(ppath + "/" + uncFile + ".flz", ppath + "/" + uncFile , true, progress2);
log += "<color=white>(" + progress2[0].ToString() + ")\n</color>";
tim = Time.realtimeSinceStartup - t1;
log += "<color=white>status: "+ flzres + " | flz time: </color>" + "<color=cyan>" + tim + " sec</color>\n\n";
log += "<color=orange>Compressing to LZ4 ... </color>";
yield return true;
//compress lz4
t1 = Time.realtimeSinceStartup;
lz4res = (int) LZ4.compress(ppath+ "/" + uncFile, ppath + "/" + uncFile + ".lz4", 9, progress3);
log += "<color=white>(" + progress3[0].ToString() + ")\n</color>";
tim = Time.realtimeSinceStartup - t1;
fio = new FileInfo(ppath + "/" + uncFile + ".lz4");
log += "<color=white>status: "+ lz4res + " | LZ4 time: </color>" + "<color=teal>" + tim + " sec</color> <color=yellow>(" + ((float)fio.Length / 1024).ToString("F") + " kb)</color>\n\n";
log += "<color=lime>Decompressing LZ4 ... </color>";
yield return true;
//decompress lz4
t1 = Time.realtimeSinceStartup;
lz4res = LZ4.decompress(ppath + "/" + uncFile + ".lz4", ppath + "/" + uncFile , bytes);
log += "<color=white>(" + bytes[0].ToString() + ")\n</color>";
tim = Time.realtimeSinceStartup - t1;
log += "<color=white>status: "+ lz4res + " | LZ4 time: </color>" + "<color=cyan>" + tim + " sec</color> \n\n";
log += "<color=orange>Compressing to brotli ... </color>";
yield return true;
//compress brotli
t1 = Time.realtimeSinceStartup;
brres = (int) brotli.compressFile(ppath+ "/" + uncFile, ppath + "/" + uncFile + ".br", progress4);
log += "<color=white>(" + progress4[0].ToString() + ")\n</color>";
tim = Time.realtimeSinceStartup - t1;
fio = new FileInfo(ppath + "/" + uncFile + ".br");
log += "<color=white>status: "+ brres + " | brotli time: </color>" + "<color=teal>" + tim + " sec</color> <color=yellow>(" + ((float)fio.Length / 1024).ToString("F") + " kb)</color>\n\n";
log += "<color=lime>Decompressing brotli ... </color>";
yield return true;
//decompress brotli
t1 = Time.realtimeSinceStartup;
progress4[0] = 0;
brres = brotli.decompressFile(ppath + "/" + uncFile + ".br", ppath + "/" + uncFile , progress4);
log += "<color=white>(" + progress4[0].ToString() + ")\n</color>";
tim = Time.realtimeSinceStartup - t1;
log += "<color=white>status: "+ brres + " | brotli time: </color>" + "<color=cyan>" + tim + " sec</color> \n\n";
log += "<color=lime>Compressing gzip ... </color>";
yield return true;
//compress gzip
t1 = Time.realtimeSinceStartup;
gzres = lzip.gzipFile(ppath+ "/" + uncFile, ppath + "/" + uncFile + ".gz", 10, gzProgress);
log += "<color=white>(" + gzProgress[0].ToString() + ")\n</color>";
tim = Time.realtimeSinceStartup - t1;
fio = new FileInfo(ppath + "/" + uncFile + ".gz");
log += "<color=white>status: "+ gzres + " | gzip time: </color>" + "<color=teal>" + tim + " sec</color> <color=yellow>(" + ((float)fio.Length / 1024).ToString("F") + " kb)</color>\n\n";
log += "<color=lime>Decompressing gzip ... </color>";
yield return true;
//decompress gzip
t1 = Time.realtimeSinceStartup;
gzProgress[0] = 0;
gzres = lzip.ungzipFile(ppath + "/" + uncFile + ".gz", ppath + "/" + uncFile , gzProgress);
log += "<color=white>(" + gzProgress[0].ToString() + ")\n</color>";
tim = Time.realtimeSinceStartup - t1;
log += "<color=white>status: "+ brres + " | gzip time: </color>" + "<color=cyan>" + tim + " sec</color> \n\n";
yield return true;
//test setting file permissions
#if !UNITY_EDITOR && !UNITY_STANDALONE_WINDOWS
Debug.Log(lzma.setFilePermissions(ppath+ "/" + uncFile, "rw","r","r"));
Debug.Log(lzip.setFilePermissions(ppath+ "/" + uncFile, "rw","r","r"));
Debug.Log(fLZ.setFilePermissions(ppath+ "/" + uncFile, "rw","r","r"));
Debug.Log(LZ4.setFilePermissions(ppath+ "/" + uncFile, "rw","r","r"));
Debug.Log(brotli.setFilePermissions(ppath+ "/" + uncFile, "rw","r","r"));
#endif
benchmarkStarted = false;
}
IEnumerator Download7ZFile() {
//make sure a previous 7z file having the same name with the one we want to download does not exist in the ppath folder
if (File.Exists(ppath + "/" + myFile)) File.Delete(ppath + "/" + myFile);
Debug.Log("downloading 7zip file");
log += "<color=white>downloading 7zip file ...\n</color>";
//replace the link to the brotli file with your own (although this will work also)
using (UnityEngine.Networking.UnityWebRequest www = UnityEngine.Networking.UnityWebRequest.Get(uri + myFile)) {
#if UNITY_5 || UNITY_5
yield return www.Send();
#else
yield return www.SendWebRequest();
#endif
if (www.error != null)
{
Debug.Log(www.error);
} else {
downloadDone = true;
log = "";
//write the downloaded brotli file to the ppath directory so we can have access to it
//depending on the Install Location you have set for your app, set the Write Access accordingly!
File.WriteAllBytes(ppath + "/" + myFile, www.downloadHandler.data);
Debug.Log("download done");
}
}
}
#else
void OnGUI(){
GUI.Label(new Rect(10, 10, 500, 40), "Does not work on WebGL or tvOS.");
}
#endif
}