Beste mensen,

In het kader van nutteloze bezigheden ging ik maar eens de database van opentaal inlezen (160k woorden) en daarvan de woordwaarde bepalen (scrabble).

Het punt is, dat bepalen duurt lang, heel lang.
Ik heb al een beetje gekeken hoe efficiënt ik kon krijgen maar het moet nog efficiënter kunnen.


<?php
$letterwaarde = array(
			'A' => 1,
			'b' => 3); //voor alle letters in het alfabet
$t = microtime(true);
while($line = $q->fetch()){
	$array = str_split(strtolower($line['woord']));
	$int = 0;
	foreach($array as $v){
		if(array_key_exists($v,$letterwaarde)){ //kunnen ook rare tekens in zitten
			$int += $letterwaarde[$v];
		}
	}
	//update doen in database
}
echo microtime(true) - $t;
?>


Aantal dingen die ik al geprobeerd heb:
-while ipv de foreach (met sizeOf() voor de while)
-ipv de if(array_key_exists()) een @ voor de $letterwaarde[$v]
-letterverschuivingen in de array

Suggesties? :)
je hoeft niet persé hoofdletters toe te voegen, je kan ook de strtoupper() gebruiken
Vincent Huisman op 01/12/2011 11:03:59

je hoeft niet persé hoofdletters toe te voegen, je kan ook de strtoupper() gebruiken


Ja heb ondertussen de array ook al gehalveerd met strtolower(), maar tis niet echt een significant verschil (scheel wel een klein beetje)
Karel hertens op 01/12/2011 11:25:29

Hoe lang is lang?
Ben voor een video project beetje met multi threading bezig en vond http://phplens.com/phpeverywhere/?q=node/view/254 een nuttig artikel.

haha, "Vind ik nuttig"


Hmm 40 seconden voor de hele boel, was een beetje scheef bezig, was vergeten dat er een fulltext index stond op de woorden :) en dan gaan updates niet zo bijster snel.
haha, het lag dus aan de sql update? vond al gek dat zoiets lang duurde.
Ja ik ging op gegeven moment toch maar even checken welk process nou zo druk bezig was, vondt het ook nogal maf.
Of het sneller is weet ik niet. Ik kan het helaas niet testen op het moment.


<?php
$letterwaarde = array(
            'A' => 1,
            'b' => 3); //voor alle letters in het alfabet

$t = microtime(true);

while($line = $q->fetch()){

	$letters = count_chars($line['woord'], 1);

    $int = 0;
		
	foreach($letters as $letter => $count){
	
	$chr = chr($letter);
	
		if(ctype_alpha($chr)){
			
			$int += ( $count * $letterwaarde[strtolower( $chr )] );
		}
	}
	
    //update doen in database
}

echo microtime(true) - $t;
?>
Dit is trouwens wel echt nerd gedrag, 40 seconden wachten lang vinden.
Karel hertens op 01/12/2011 11:39:49

Dit is trouwens wel echt nerd gedrag, 40 seconden wachten lang vinden.


Met de fulltext index was het eerder 40+ sec per 100, en dan duurt het ineens een lading uurtjes.

Reageren