Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [XML]Stosować atrybuty czy węzły, Wydajność
gargamel
post 29.11.2011, 17:03:21
Post #1





Grupa: Zarejestrowani
Postów: 278
Pomógł: 35
Dołączył: 25.06.2010

Ostrzeżenie: (0%)
-----


Tworzę sporego XML-a i tak się zastanawiam jak będzie lepiej.
XML będzie zawierał sporą ilość elementów, do których będę musiał się jakoś odwołać.
Mam do wyboru
1. Każdemu z elementów nadać unikalny identyfikator jako atrybut
2. Owy identyfikator umieścić jako dziecko danego elementu
Taki XML w uproszczeniu wyglądał by następująco:

Wariant 1:
  1. <test>
  2. <item id="1">
  3. <element>1</element>
  4. </item>
  5. <item id="2">
  6. <element>1</element>
  7. </item>
  8. <item id="3">
  9. <element>1</element>
  10. </item>
  11. .
  12. .
  13. .
  14. </test>


Wariant 2:
  1. <test>
  2. <item>
  3. <id>1</id>
  4. <element>some data</element>
  5. </item>
  6. <item>
  7. <id>2</id>
  8. <element>some data</element>
  9. </item>
  10. <item>
  11. <id>3</id>
  12. <element>some data</element>
  13. </item>
  14. .
  15. .
  16. .
  17. </test>

Chciałem sprawdzić, która metoda będzie wydajniejsza.

Napisałem taki kawałek kodu aby to sprawdzić:
  1. <?php
  2. function getNodeByAttr( $nodes, $attribName, $attribValue ){
  3. foreach( $nodes as $node ){
  4. $temp = $node -> attributes();
  5. if($temp[$attribName]==$attribValue) return $node;
  6. }
  7. }
  8.  
  9. function getNodeByChild( $nodes, $childNodeName, $childNodeValue ){
  10. foreach( $nodes as $node ){
  11. if( $node -> $childNodeName == $childNodeValue) return $node;
  12. }
  13. }
  14.  
  15.  
  16. $attr = new SimpleXMLElement( 'a.xml', null, true);
  17. $node = new SimpleXMLElement( 'n.xml', null, true);
  18.  
  19. $t1 = microtime(true);
  20. for($i=0;$i<1000;$i++){
  21. getNodeByAttr( $attr -> item, 'id', '50' );
  22. }
  23. $t2 = microtime(true);
  24.  
  25. $t3 = microtime(true);
  26. for($j=0;$j<1000;$j++){
  27. getNodeByChild( $node -> item, 'id', '50' );
  28. }
  29. $t4 = microtime(true);
  30.  
  31. echo "By attrib: ".( $t2-$t1 )."s <br>";
  32. echo "By node: ".( $t4-$t3 )."s";
  33. ?>


I co się okazało ( w sumie mnie to nie dziwi, bo opcja 1 uruchamia dodatkowo funkcję attributes() ) że wrzucając identyfikatory w węzły skrypt działa zdecydowanie szybciej.
I teraz dylemat, bo mimo wszystko poprawniejszym wydaje się sposób 1... Co o tym myślicie?

Go to the top of the page
+Quote Post
qrzysztof
post 29.11.2011, 17:57:27
Post #2





Grupa: Zarejestrowani
Postów: 220
Pomógł: 19
Dołączył: 25.04.2009

Ostrzeżenie: (0%)
-----


Ekspertem od XML-a może nie jestem, ale wydaje mi się, że niepotrzebnie masz dylemat. Ja wybrałem zdecydowanie wariant 2, jeszcze zanim przeczytałem to, co napisałeś na końcu.

Moim zdaniem jeśli coś jest wydajniejsze to nie ma co snuć rozważań na temat większej i mniejszej poprawności, ale to tylko moje zdanie smile.gif


--------------------
Znalazłeś sam rozwiązanie swojego problemu? Nie pisz "już wiem, do zamknięcia". Podziel się rozwiązaniem - inni będą mieli łatwiej.
Go to the top of the page
+Quote Post
miloszmuszynski
post 29.11.2011, 18:19:54
Post #3





Grupa: Zarejestrowani
Postów: 1
Pomógł: 0
Dołączył: 28.11.2011

Ostrzeżenie: (0%)
-----


Użyłbym drugiej wersji. Atrybuty są fajne, ale skoro wszystkie elementy mają ID, to nie ma raczej potrzeby wyrzucania go do atrybutów - to jest normalna własność elementów.

A z ciekawości: jak duża była ta różnica w wydajności?

Ten post edytował miloszmuszynski 29.11.2011, 18:20:32
Go to the top of the page
+Quote Post
gargamel
post 29.11.2011, 18:47:54
Post #4





Grupa: Zarejestrowani
Postów: 278
Pomógł: 35
Dołączył: 25.06.2010

Ostrzeżenie: (0%)
-----


No taki trochę typowy dylemat między tym co czytelne dla oka, a co dla komputera.
W sumie XML często jest udostępniany innym "na zewnątrz", więc dobrze by było aby był spójny i logiczny. No ale chyba jednak zdecyduję się na opcję szybszą.

Różnica - opcja 2 szybsza o trochę ponad 30%.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 14.08.2025 - 14:53