Optimisation accès aux objets

août 2005 modifié dans API AppKit #1
Salut,

Ca fait un moment que je me demande si dans :

<br />	NSLog(@&quot;11111111&quot;);<br /><br />	int i;<br />	NSString *s=@&quot;nil&quot;;<br /><br />	for (i=0;i&lt;100000000;i++)<br />	{<br />		[s isEqualToString:@&quot;string&quot;];<br />	}<br /><br />	NSLog(@&quot;22222222&quot;);<br /><br />


Le compilateur optimise de manière à  ne pas créer la chaine à  chaque fois mais pour avoir un équivalent de :

<br />	NSLog(@&quot;11111111&quot;);<br /><br />	int i;<br />	NSString *s=@&quot;nil&quot;;<br />	NSString *r=@&quot;string&quot;;<br />	<br />	for (i=0;i&lt;100000000;i++)<br />	{<br />		[s isEqualToString:r];<br />	}<br /><br />	NSLog(@&quot;22222222&quot;);<br />



Mais visiblement ce n'est pas le cas, après plusieurs essais le premier code nécéssite 10 sec contre 8 pour le second :(

Vous allez me dire que l'on compare pas les chaines tous les chaines, les chaines dans le code ce pas terrible... Mais récupérer un pointeur depuis une méthode c'est assez courant :

<br />- (NSString*)string<br />{<br />	static NSString *string=@&quot;string&quot;;<br />	return string;<br />}<br /><br />- (void)toto<br />{<br />	NSLog(@&quot;11111111&quot;);<br /><br />	int i;<br />	NSString *s=@&quot;nil&quot;;<br />	NSString *r=[self string];<br />	<br />	for (i=0;i&lt;100000000;i++)<br />	{<br />		[s isEqualToString:r];<br />	}<br /><br />	NSLog(@&quot;22222222&quot;);<br />}<br />


met 10 sec contre 15 avec :

<br />	for (i=0;i&lt;100000000;i++)<br />		[s isEqualToString:[self string]];<br />


Que ce passe t-il ? Mes tests sont bidons ? Je compile en mode "Release" avec option de compilation -O3. Mais surtout, comment faire pour le compilo puisse l'optimiser seul ?

Bon, vous allez aussi me dire que je ne demande jamais le même object 1M de fois de suite...

Réponses

  • maconnectmaconnect Membre
    14:56 modifié #2
    autre chose dans le même style. Si tu fais:
    <br />#define maChaine @&quot;string&quot;<br />-(void)f<br />{<br />NSLog(@&quot;11111111&quot;);<br /><br />&nbsp; &nbsp; &nbsp; &nbsp; int i;<br />&nbsp; &nbsp; &nbsp;  NSString *s=@&quot;nil&quot;;<br />&nbsp; &nbsp; &nbsp;  <br />&nbsp; &nbsp; &nbsp; &nbsp; for (i=0;i&lt;100000000;i++)<br />&nbsp; &nbsp; &nbsp;  {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [s isEqualToString: maChaine];<br />&nbsp; &nbsp; &nbsp;  }<br /><br />&nbsp; &nbsp; &nbsp; &nbsp; NSLog(@&quot;22222222&quot;);<br />}<br />
    
    et bien une seule instance sera créée pour @string et du coup tu peux très bien faire ceci:
    <br />#define maChaine @&quot;string&quot;<br />-(void)f<br />{<br />NSLog(@&quot;11111111&quot;);<br /><br />&nbsp; &nbsp; &nbsp; &nbsp; int i;<br />&nbsp; &nbsp; &nbsp;  NSString *s= maChaine;<br />&nbsp; &nbsp; &nbsp;  <br />&nbsp; &nbsp; &nbsp; &nbsp; for (i=0;i&lt;100000000;i++)<br />&nbsp; &nbsp; &nbsp;  {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (s==maChaine)<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  //blabla<br />&nbsp; &nbsp; &nbsp;  }<br /><br />&nbsp; &nbsp; &nbsp; &nbsp; NSLog(@&quot;22222222&quot;);<br />}<br />
    
    pour comparer les deux chaà®nes, car comparer deux pointeurs c'est plus rapide que comparer deux chaà®nes..

    voilà , mes 2 cents
  • septembre 2005 modifié #3
    -- je reviens
  • 14:56 modifié #4
    J'ai les cheveux qui poussent vers le dedans... et personne ne m'a rien dit ?

    [self string] dans mon exemple renvoit toujours le même object, mais ce n'est pas forcément toujours le cas et le compilateur ne peut le savoir...

    maconnect est aussi tombé ou il avait un temps d'avance ?

    Bref, la science infuse ce n'est pas pour tous.

    Vous ne comprenez rien à  ce que je dis ? Tapez F1.
Connectez-vous ou Inscrivez-vous pour répondre.