parser

Написать ответ на текущее сообщение

 

 
   команды управления поиском

аналогично

Misha v.3 17.06.2010 03:14 / 17.06.2010 03:43

если использовать оригинальный метод (убрал вызов compact и определил локальные переменые), то результаты такие (Time, BL и KB -- это то, что возвращаем Erusage):
Time: 1031.25 ms
BL: 12668
KB: 13152
ever_allocated_since_compact: 161322

то-же, но с явным определением result:
Time: 968.75 ms
BL: 9560
KB: 10128
ever_allocated_since_compact: 158294

если переписать метод на использование DOM (см. ниже. я использовал Node:foreachChild, который делает кучей ненужной для данного случая работы), то результаты такие:
Time: 515.625 ms
BL: 7824
KB: 8436
ever_allocated_since_compact: 22595.8

почувствуйте, как говорится, разницу. особенно в ever_allocated_since_compact...
@USE
Erusage.p
Node.p


@main[]
$x[^xdoc::load[x.xml]]
^memory:compact[]
^Erusage:measure{
	$h[^_xml2hash[$x]]
}[v]
#^dstop[$h]

Time: $v.time ms<br />
BL: $v.memory_block<br />
KB: $v.memory_kb<br />
ever_allocated_since_compact: $status:memory.ever_allocated_since_compact<br />

@_xml2hash2[xNode][i;result;node]
	^switch($xNode.nodeType){
		^case(1){
			$result[^hash::create[]]
			$i(0)
			^if($xNode.nodeName eq "ids" || ^xNode.getAttribute[type] eq "array"){
				^Node:foreachChild[$xNode;;node;]{
					$result.[$i][^_xml2hash2[$node]]
					$i($i+1)
				}
			}{
				^Node:foreachChild[$xNode;;node;]{
					$result.[$node.nodeName][^_xml2hash2[$node]]
					$i($i+1)
				}
			}
			^if(!$i){
				$result[$xNode.firstChild.nodeValue]
			}
		}

		^case(3){
			$result[$xNode.nodeValue]
		}

		^case(9){
			$result[^_xml2hash2[$xNode.documentElement]]
		}

		^case[DEFAULT]{
			^throw[...;...]
		}
	}
#end @_xml2hash2[]
кстати результаты работы методов немного не совпадают, и мне кажется, что ошибка в оригинальном xml2hash. если расскоментировать dstop и смотреть на получившийся хеш, то видим.

xml2hash:
$.0[
		$.created_at[Wed Jun 16 15:04:36 +0000 2010]
		$.id[16312661011]
		...
		$.in_reply_to_screen_name[void]
		$.contributors_enabled[
			$.id[12]
			$.name[Jack Dorsey]
xml2hash2:
$.0[
		$.created_at[Wed Jun 16 15:04:36 +0000 2010]
		$.id[16312661011]
		...
		$.in_reply_to_screen_name[void]
		$.user[
			$.id[12]
			$.name[Jack Dorsey]
разница в 3 строке снизу (contributors_enabled/user). судя по xml должно быть user, хотя может я не понял исходную задумку.