Re: Open / Create

Thomas De Contes <[email protected]> Sun, 23 Aug 2020 16:19:53 +0200
Newsgroups gmane.comp.lang.ada.france
Message-ID <[email protected]>
Le 2 juin 2020 à 11:37, Jean-Pierre Rosen a écrit :

> J'aurais peut-être dû faire plus
> attention avant de répondre...

je ne suis pas sur de ce que tu sous entend,
moi je suis très content que tu m'aides autant que ça en te trompant de temps en temps, plutôt que tu ne m'aides pas :-))


>>>> - créer le fichier s'il n'existe pas,
>>>> - écrire à la suite, sans effacer le contenu, s'il existe
>> 
>> si je comprends bien, tu me suggères de faire
>>        begin
>>           Open (File, Append_File, Name);
>>        exception
>>           when Name_Error =>
>>              -- File does not exist
>>              Create (File, Out_File, Name);
>>        end;
>> 
>> plutôt que
>>         if Ada.Directories.Exists( Name ) then
>>            Open (File, Append_File, Name);
>>         else
>>            Create (File, Out_File, Name);
>>         end if; 
>> ?
>> 
>> est ce que, quand on fait des appels fréquents comme pour un log de debug, l'un des 2 est plus couteux que l'autre ?
> En principe, les Open sont rares, donc ce n'est pas la peine de chercher
> à optimiser.


l'optimisation est un sujet qui a tendance à m'ennuyer

au début, j'etais comme toi quand tu disais "ce n'est pas au développeur de s'occuper d'optimiser, il faut laisser le compilateur s'en occuper", mais à l'extreme, donc ça m'a valu quelques ennuis ...
donc maintenant j'essaye de faire un peu attention quand même :-)

je ne me rend pas bien compte de l'ordre de grandeur des choses,
il me semblait que quand on active le log de debug, ça peut être assez fréquent quand même (ça dépend des logiciels peut-être, ou alors non en proportion d'autres types d'opérations qu'il est plus intéressant d'optimiser ?)


en l'occurrence c'est ta formule qui était la bonne,
puisque même si on considère que les Open sont fréquents, les Create sont rares en proportion,
et donc, même si le traitement de l'exception est plus lourd que l'appel à Ada.Directories.Exists, à chaque fois qu'on fait un Open et pas un Create, on appelle seulement Open ta formule, tandis qu'on appelle Ada.Directories.Exists en plus avec la mienne :-)


pour info, voilà ce que j'ai fait finalement :
(je ne sais pas laquelle des 2 formes est la plus pratique à lire pour toi)
http://svn.savannah.gnu.org/viewvc/rapid/branches/gtkada-2.24/mcc_gui/mcc-msg.adb?view=markup&pathrev=222
http://svn.savannah.gnu.org/viewvc/rapid/branches/gtkada-2.24/mcc_gui/mcc-msg.adb?r1=222&r2=221&pathrev=222
(c'est la procedure CreateAppend)

c'est bête que
Create (File, Append_File, Name);
ne fasse pas ça directement, plutôt que d'être l'équivalent de
Create (File, Out_File, Name);
(tiens d'ailleurs il n'y a aucune précision dans le A.8.2)

mais bon, voilà, c'est fait :-)


> 
>> est ce que c'est simplement pour éviter un "with Ada.Directories;" ?
> Honnètement, ce code date d'avant Ada.Directories.

j'avais oublié, désolé
(j'ai commencé ada en 2002, et Ada.Directories est apparu pas longtemps après)

> 
>> c'est bizarre,
>> comparant :
>> http://www.ada-auth.org/standards/rm12_w_tc1/html/RM-A-10-1.html
>> http://www.ada-auth.org/standards/rm12_w_tc1/html/RM-A-12-1.html
>> on dirait que le A.10.1 a été tronqué !

il me semblait avoir retrouvé un autre endroit dans la doc où on trouve l'équivalent de la suite de A.12.1, pour les autres types de fichiers, mais je n'arrive pas à remettre la main dessus, tant pis


même la 2ème fois j'avais encore mal cherché, et j'avais raté les liens pointant sur
http://www.ada-auth.org/standards/rm12_w_tc1/html/RM-A-8-2.html
où j'ai enfin trouvé certains détails que je cherchais, sur comment tout ça fonctionne :-)

l 10 :
"If no elements have been written and the file mode is Append_File, then the closed file is unchanged."
est ce que ça veut dire que la date de modification n'est pas changée non plus ?
(je trouverais logique qu'elle le soit, puisque le fichier aura été ouvert en écriture)


> En fait, Stream_IO se rapproche plus d'un Direct_IO sur des
> Stream_Elements que de Text_IO.

ah bon ?

moi j'aurais plutôt dit que ça ressemblerais à

package Ada.Streams.Stream_IO is new Ada.Sequential_IO(Stream_Element);
package Ada.Text_IO is new Ada.Sequential_IO(Character);

et que Ada.Direct_IO était plus "éloigné" des autres,

non ?


-- 
Téléassistance / Télémaintenance
http://invites.biocer.fr/thomas-de-contes/

_______________________________________________
Ada-france mailing list
[email protected]
https://mail.ada-france.org/cgi-bin/mailman/listinfo/ada-france