Open rysson opened 6 years ago
Testy wydajnościowe na obecną chwilę dla dość wrednego (1200 dużo krótkich tagów) pliku 800kB. Czas w sekundach.
Python2
Test | mrknow | cherry | rysson |
---|---|---|---|
tags | 2.207 | 5.138 | 4.949 |
attrs | 1.638 | 1.755 | 1.603 |
Python3
Test | mrknow | cherry | rysson |
---|---|---|---|
tags | 0.381 | 1.029 | 0.837 |
attrs | 0.288 | 0.386 | 0.290 |
Aż szkoda, że Kodi nie obsługuje Pythona 3 :-)
Poprawny wynik jest pogrubiony
parseDOM(...) | mrknow | cherry | rysson |
---|---|---|---|
('<a>A</a><a x="1">B</a> ', 'a') |
['A '] |
['A ', 'B '] |
['A ', 'B '] |
('<a z=">">A</a> ', 'a') |
['">A '] |
['">A '] |
['A '] |
('<a>A<a>B</a></a> ', 'a') |
['A<a>B</a> ', ''] |
['A<a>B</a> ', 'B '] |
['A<a>B</a> ', ''] |
Funkcja po poprawkach. Wygląda, że nie tylko bardziej poprawnie znajduje tagi, ale i szybciej działa.
parseDOM('...', 'a') | mrknow | cherry | rysson |
---|---|---|---|
<a>A</a>Q |
['A '] |
['A '] |
['A '] |
<a>A<a>B</a>C</a>Q |
['A<a>B</a>C ', ''] |
['A<a>B</a>C ', 'B '] |
['A<a>B</a>C ', 'B '] |
<a>A<a/>B</a>Q |
['A<a/>B '] |
['A<a/>B ', ''] |
['A<a/>B ', ''] |
<a>A<x>B<a>C</x>D</a>Q</a>R |
['A<x>B<a>C</x>D</a>Q ', ''] |
['A<x>B<a>C</x>D</a>Q ', 'C</x>D '] |
['A<x>B<a>C</x>D ', 'C '] |
<a>A</a><a x="1">B</a>Q |
['A '] |
['A ', 'B '] |
['A ', 'B '] |
<a z=">">A</a>Q |
['">A '] |
['">A '] |
['A '] |
Czas w sekundach.
Test | mrknow | cherry | rysson |
---|---|---|---|
tags | 2.148 | 5.220 | 0.297 |
attrs | 1.602 | 1.733 | 0.122 |
Test | mrknow | cherry | rysson |
---|---|---|---|
tags | 0.379 | 1.038 | 0.238 |
attrs | 0.284 | 0.381 | 0.087 |
Zmian dużo, (patrz dokumentacja), czas wykonania nam podupadł i trzeba było się zabrać za wydajność.
Po poprawkach (czas w sekundach). Ciekawe jest zrównanie się czasów Pythona 2 i 3.
Test | mrknow | cherry | rysson | rysson.Node |
---|---|---|---|---|
tags | 2.209 | 5.165 | 0.202 | 0.071 |
attrs | 1.626 | 1.759 | 0.085 | — |
Test | mrknow | cherry | rysson | rysson.Node |
---|---|---|---|---|
tags | 0.393 | 1.121 | 0.202 | 0.072 |
attrs | 0.299 | 0.393 | 0.085 | — |
rysson.Node to pobieranie samych węzłów Node(), w których zarówno atrybuty jak i zawartość jest parsowana na żądanie. Pomiar pokazuje czas samego szukania, bez parsowania. Stąd ten czas jeszcze krótszy niż dla attrs (który notabene korzysta wewnętrznie z Node).
Funkcja
parseDOM()
jest namiastką parsera HTML. Jest to alternatywa dla:parseDOM()
jest o tyle istotna, że na niej opera się parsowanie niemal każdej strony.Funkcję znalazłem w MrKnow. W Cherry (w PWT) jest funkcja zdecydowanie nowsza, lepiej znajdująca elementy, niemniej znacząco wolniejsza. Zacząłem przerabiać ją aby dało się obłożyć czymś w rodzaju selektora CSS. Mój kod opera się na MrKnow bo parę dni temu jeszcze nie wiedziałem, że jest inna implementacja w PWT. Obecnie łączę cechu obu realizacji, czyli moja wersja niemal tak wolna ja ta z PWT i niemal tak dziurawa jak ta z MrKnow :-D
Głęboki refactoring prowadzę równolegle do innych prac dla Cherry API ma być niezmienne z dokładnością do poprawek błędów i dodatkowych funkcji.
¹) Jest nadzieja dla binarnych paczek choć ciągle jest to za dużo zachodu: