Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [XML]Stosować atrybuty czy węzły, Wydajność
gargamel
post
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

Posty w temacie


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

 



RSS Aktualny czas: 5.10.2025 - 14:10