1
00:00:00,800 --> 00:00:02,450
Bonjour. Dans ce cours je
vais vous montrer comment on

2
00:00:02,650 --> 00:00:05,290
peut faire du profilage
d'application en Pharo.

3
00:00:05,660 --> 00:00:07,660
Ça veut dire comment on
va mesurer l'exécution de

4
00:00:07,860 --> 00:00:09,830
certaines expressions et
pour savoir si on peut les

5
00:00:10,030 --> 00:00:12,580
remplacer par d'autres pour
gagner du temps, lors de l'exécution

6
00:00:12,780 --> 00:00:13,540
d'un programme.

7
00:00:14,830 --> 00:00:17,030
En gros ce que disent les
gens, c'est que quand on n'a

8
00:00:17,230 --> 00:00:20,100
jamais fait de profilage
d'une application, on a

9
00:00:20,300 --> 00:00:22,140
potentiellement un
gain entre 40 et 50 %.

10
00:00:22,340 --> 00:00:25,200
Moi, je n'en suis pas
convaincu ou je ne le sais pas, je

11
00:00:25,400 --> 00:00:26,310
n'ai pas la preuve
de ce genre de choses.

12
00:00:26,510 --> 00:00:28,250
Par contre, je vais vous
montrer quels sont les outils

13
00:00:28,450 --> 00:00:31,420
qui existent en Pharo
pour faire ce profilage.

14
00:00:32,720 --> 00:00:34,780
La première expression qui
existe en Pharo, c'est timeToRun.

15
00:00:36,170 --> 00:00:38,870
C'est un message qu'on va
envoyer à un block qui va nous

16
00:00:39,070 --> 00:00:40,760
dire le temps
d'exécution d'une expression.

17
00:00:41,610 --> 00:00:45,930
Là par exemple sur
factoriel 1 000, je veux mesurer le

18
00:00:46,130 --> 00:00:47,650
temps d'exécution de
factoriel 1 000, je le mets dans un

19
00:00:47,850 --> 00:00:49,770
bloc et j'envoie le
message timeTo Run.

20
00:00:51,150 --> 00:00:55,000
Une fois qu'on a timeToRun, c'est
très facile de comparer 2 exécutions.

21
00:00:55,370 --> 00:00:57,440
Là, je vous propose un
petit exercice qui est de dire

22
00:00:57,790 --> 00:01:01,440
est-ce que si je fais un
select suivi d'un collect, c'est

23
00:01:01,640 --> 00:01:04,740
plus lent ou pas
qu'un select puis collect.

24
00:01:05,550 --> 00:01:07,800
Sachant que là, ça
implique qu'il y aurait 2 passages

25
00:01:08,630 --> 00:01:10,680
dans le premier cas et un
passage dans le deuxième cas.

26
00:01:11,510 --> 00:01:13,600
Je pense que ce sera plus
lent mais on va le vérifier.

27
00:01:15,460 --> 00:01:20,040
Je créé ma collection dans
les 2 cas de figure avec 10

28
00:01:20,240 --> 00:01:21,360
éléments, c'est une
petite collection.

29
00:01:23,120 --> 00:01:27,930
Je vais faire une

30
00:01:28,130 --> 00:01:31,000
boucle pour pouvoir exécuter un
certain nombre de fois les 2 expressions.

31
00:01:31,200 --> 00:01:33,480
Ce que vous voyez, c'est que
dans la première partie, là

32
00:01:33,680 --> 00:01:35,380
j'ai ma collection et je
dis que je veux sélectionner

33
00:01:35,580 --> 00:01:38,940
tous les éléments qui sont
plus grands que 5 et après,

34
00:01:39,140 --> 00:01:41,750
ces éléments que j'aurais
sélectionnés, je veux les élever au carré.

35
00:01:42,160 --> 00:01:44,940
Et dans la deuxième
expression, je vais dire que je veux

36
00:01:45,140 --> 00:01:49,840
sélectionner ceux qui sont plus
grands que 5 et les élever au carré.

37
00:01:50,390 --> 00:01:52,230
On voit que le système
me dit que là c'est 500

38
00:01:52,430 --> 00:01:55,670
millisecondes et là c'est
368 millisecondes. Finalement,

39
00:01:56,020 --> 00:01:57,520
il vaut mieux utiliser
la deuxième expression.

40
00:01:57,720 --> 00:01:59,010
Vous voyez un petit peu
comment ça fonctionne.

41
00:01:59,210 --> 00:02:00,000
Après, c'est à vous de le faire.

42
00:02:00,210 --> 00:02:02,370
Ce qu'il faut voir, c'est
qu'effectivement on doit

43
00:02:02,570 --> 00:02:07,060
parfois mettre de très
grandes boucles à l'intérieur pour

44
00:02:07,470 --> 00:02:09,130
amplifier la mesure.

45
00:02:09,460 --> 00:02:11,020
Il faut le faire dans les
2 cas pareil, évidemment.

46
00:02:12,340 --> 00:02:16,710
Sinon, il y a un autre
message qui s'appelle bench qui

47
00:02:17,530 --> 00:02:19,640
va nous dire combien de fois le code,

48
00:02:22,890 --> 00:02:27,810
qui est étudié, a été
exécuté durant 5 secondes.

49
00:02:28,010 --> 00:02:30,250
Là je reprends mon exemple
factoriel 1 000, bench, là je

50
00:02:30,450 --> 00:02:33,280
vois que je peux
l'exécuter 110000 fois par seconde.

51
00:02:35,600 --> 00:02:38,920
Dans ce cas de figure, ce qu'on veut
c'est que le chiffre soit le plus haut.

52
00:02:39,550 --> 00:02:42,730
Il y a une variante de
bench qui s'appelle bench for où

53
00:02:42,930 --> 00:02:44,500
vous pouvez spécifier la taille.

54
00:02:44,700 --> 00:02:48,000
Là ce qui est sympa, c'est
de voir que 2 secondes, c'est

55
00:02:48,200 --> 00:02:51,530
vraiment le message secondes
qui est envoyé au message 2,

56
00:02:52,280 --> 00:02:56,000
ça va nous donner sûrement
une duration, une instance de

57
00:02:56,200 --> 00:03:00,390
la classe duration qui va
contrôler combien de temps le

58
00:03:00,590 --> 00:03:01,350
système va tourner.

59
00:03:01,550 --> 00:03:03,760
Vous voyez, ça c'est encore
une illustration que tout est

60
00:03:03,960 --> 00:03:06,870
objet dans Pharo, donc
spécifier les secondes, je fais 2

61
00:03:07,070 --> 00:03:10,920
secondes, j'envoie le
message secondes à l'objet 2.

62
00:03:12,100 --> 00:03:15,890
Il y a aussi ce qu'on
appelle un profiler qui est basé

63
00:03:16,090 --> 00:03:19,340
sur des techniques de
sample. Vous allez exécuter votre

64
00:03:20,220 --> 00:03:23,900
 programme et lui, il va
aller à intervalles réguliers

65
00:03:24,100 --> 00:03:27,040
inspecter la pile
d'exécution et voir ce qui est sur

66
00:03:27,240 --> 00:03:29,000
cette pile d'exécution et
collecter l'information.

67
00:03:29,920 --> 00:03:31,260
Comment est-ce qu'on l'invoque ?

68
00:03:31,540 --> 00:03:35,680
On fait TimeProfiler, spyOn
et on va lui passer un block.

69
00:03:36,470 --> 00:03:38,360
Là je dis que je veux
répéter 20 fois que je vais

70
00:03:38,560 --> 00:03:43,060
afficher sur le Transcript
factoriel 100 que je convertis

71
00:03:43,260 --> 00:03:45,200
en chaîne, c'est ça qui
coûte le plus cher en général.

72
00:03:46,220 --> 00:03:49,800
Et après, le profiler va
nous donner ce genre de

73
00:03:50,000 --> 00:03:52,750
résultats avec un arbre qui
va nous montrer les branches

74
00:03:52,950 --> 00:03:54,100
parmi lesquelles on a
passé le plus de temps.

75
00:03:54,300 --> 00:03:57,360
Là par exemple, il nous
montre qu'on a passé 63 % du

76
00:03:57,560 --> 00:03:59,410
temps dans la
méthode printOn by base.

77
00:04:02,000 --> 00:04:03,790
C'est juste pour vous
montrer que ça existe, il y a un

78
00:04:04,000 --> 00:04:06,770
profiler comme ça, vous pouvez
jouer avec si vous êtes intéressé.

79
00:04:08,620 --> 00:04:11,270
En résumé, dans une
première approche, vous pouvez

80
00:04:11,470 --> 00:04:15,480
utiliser timeToRun, bench
et le profiler, il y a un

81
00:04:15,680 --> 00:04:18,390
chapitre dans le livre
"Deep into Pharo" qui montre ce

82
00:04:18,590 --> 00:04:20,890
genre de techniques d'optimisation.

83
00:04:21,270 --> 00:04:24,330
Maintenant, je voulais
juste faire une petite remarque.

84
00:04:24,530 --> 00:04:26,860
C'est que vous voyez que
dans ces 3 exemples à chaque

85
00:04:27,060 --> 00:04:29,830
fois on utilise des blocks,
ça veut dire que là ici c'est

86
00:04:30,030 --> 00:04:31,780
un block, là aussi c'est un block.

87
00:04:32,000 --> 00:04:34,660
Pourquoi? Parce que ce que
vous avez vu dans le cours

88
00:04:34,860 --> 00:04:39,520
sur les blocks, c'est
que la définition du block

89
00:04:39,780 --> 00:04:42,350
n'exécute pas et donne
la possibilité à bench de

90
00:04:43,510 --> 00:04:46,380
contrôler le nombre
d'exécutions, ou de décider quand on

91
00:04:46,580 --> 00:04:47,630
commence l'exécution du programme.

92
00:04:48,370 --> 00:04:50,710
L'autre remarque que j'ai
à vous faire, c'est soyez

93
00:04:50,910 --> 00:04:53,370
curieux, allez voir comment
timeToRun est implémenté et

94
00:04:53,570 --> 00:04:55,910
comment bench est
implémenté. Pour ça, vous n'avez qu'à

95
00:04:56,110 --> 00:04:59,290
cliquer sur l'expression, et
faire browse ou implementer

96
00:04:59,490 --> 00:05:00,510
dessus et vous allez voir le code.

