Site des Oraux

Programmation Orientée Objet (25) :: post
Années :: 2004 :: 2005 :: 2006 :: 2007 :: 2008 :: 2009 :: Toutes

Post nº25 (id3970) envoyé par LeSaumon  le 24 Apr 2009, 23:00
Après m'etre fait dégommé (et agressé ... ) par l'indien au projet ( rassurez vous,il démonte tout le monde...),Bersini m'a écrit 6 instructions avec ses stiffs pourris...

Une classe A contient une méthode faireA() , une classe B contient une méthode faireA(),faireB()
B hérite de A

A a = new B();
B b = new A();
a.faireA();
a.faireB();
b.faireA();
b.faireB();

Et la question fatidique ...Ou sont les erreurs ? Que se passe t'il ?
Après 3 minutes de réflexion,je me lance...
La 1 ere méthode est correcte , la seconde non
La 3 eme est correcte,c'est bien la méthode faireA() de B qui est executé ...Il a pas eu l'air de broncher
sur la 4 eme,je suis parti en vrille , j'ai tout sorti jusqu'à me rappeler qu'il fallait caster...et donc faire (B) a.faireB();

Même en arrivant péniblement à la bonne réponse, Bersini m'a dit que je m'embrouillais et que je ne maitrisais pas la Programmation OO!!!.

Conclusion : lisez son bouquin tout au long de l'année , pas la veille comme moi ( faut dire qu'une nuit blanche accompagnée des vannes de Bersini,j'ai vu mieux...)

Post nº24 (id3965) envoyé par East  le 22 Apr 2009, 19:31
2 classes en UML il faut écrire le code des appels de message entre elle + une question sur les exceptions. Il m'a demandé si j'en avais dans le projet. A partir de cela il a fallut écrire un code utilisant cela (try{} + catch{}) et aussi comment créer une exception ( faire une classe exception et pouvoir la placé dans un diagramme UML) pas oublié throws et throw. L'examen est abordable

Post nº23 (id3964) envoyé par etienne  le 21 Apr 2009, 23:45
bon j'ai eu comme question : 2 classes A et B rliées par une association bidirectionnelle avec d'un côté 1 et de l'autre n

Post nº22 (id3963) envoyé par kyllian  le 21 Apr 2009, 20:34
Alors je n'ai absolument pas eu les vents favorables avec moi puisque je suis tombé sur design pattern et je savais pas a quoi cela correspondait. Donc j'ai pas parlé longtemps et sa tombe bien car je suis pas resté longtemps. Bonne chance aux prochains

Post nº21 (id3962) envoyé par spritch  le 21 Apr 2009, 19:40
Quand je dit implementer l'interface je sous-entend le mot clé magique : implements

voila bye

Post nº20 (id3961) envoyé par spritch  le 21 Apr 2009, 19:32
J'ai eu le MultiThreading. Comment implementer un thread et savoir l'utiliser dans un code que Bersini met chaleureusement a votre disposition :)
Ensuite il demande comment est representer un Thread dans un diagramme UML en particulier ou le place t'on. Est-ce qu'un Thread est une interface ? Non !!!
Cerise sur le gateau (ou pas ;) interface Runnable. comment l'implementer, a quoi ca sert, de combien de methode dispose telle. Le reste était quelques sous-questions sur les interfaces.

bye

Post nº19 (id3960) envoyé par Le pingouin masqué  le 21 Apr 2009, 17:16
Bersini a d'abord dessiné au tableau un diagramme de classes et m'a demandé d'écrire le code associé :

La classe A est composée d'objets B (1-infini) et les objets de la classe B envoient des messages aux objets A.

=> Cela veut dire que A contient une liste d'objet B (interprétation de la composition (1-infini) et aussi qu'à la création de chaque objet B dans A, on passe une référence de l'objet A, afin que l'objet B créé puisse envoyer des messages (effectuer des méthodes) avec l'objet A qui l'a créé.

Les classes C1 et C2 héritent de la classe B. Les objets B, C1 et C2 possèdent la méthode non-statique faire()

=> Cela veut dire que la classe B définit la méthode faire(), et que celle est redéfinie par ses enfants C1 et C2

Ensuite, Bersini a dessiné un diagramme de séquence correspondant au diagramme de classes dans laquelle les objets B, C1 et C2 s'envoient des messages et effectuent leur méthode faire() respective. La seule subtilité était que l'objet C2 s'envoie un message faire() à lui-même, ce qui correspond en fait à l'appel de la fonction faire() de sa superclasse B.

J'espère avoir été clair. gl hf!

Post nº18 (id3959) envoyé par Anonyme n°2  le 21 Apr 2009, 14:38
Garbage Collector : expliquer tout ce qui ce passe dans la mémoire, comment Java gère sa mémoire quoi. Illustrer ceci par un schéma de la mémoire RAM. Dans celui donc representé les pointeures, les objet, ect... Parler aussi des avantages et des inconvénients par rapport à la pile LIFO et la mémoire TAS (en fait il vau mieux décrire ces deux méthodes de mémoire). Il demande aussi de representer cela sous forme de code. C'est-à-dire comment invoqué le GC, quelles sont ces méthodes. Est-ce que le fait de mettre à NULL un pointeurs l'élimine de la mémoire.

Bref question pas facile du tout surtout l'illustration sous forme de code le mieux est d'avoir lu le bouquin car tout y est expliquer ( du moins mieux que sur le net )




*Spécial* Post nº17 (id3958) envoyé par anonyme  le 21 Apr 2009, 08:16
la question portait sur la redéfinition de la méthode equals() d'un objet A associé à un autre objet B.

Post nº16 (id3529) envoyé par SHubaka  le 11 Jun 2008, 18:51
Ma question etait pas dans le syllabus de Bersini (jcomprend tjrs pas pourquoi il l'a posée d'ailleurs!) C'est :

En java, quand on crée un tableau style entier 2x2, combien d'objets sont créés en réalité?
Rep : 7 (le chiffre magique ;)
1 pour le "pointeur" vers le tableau, 1 pour chaque ligne de la matrice (2), et 4 pour chaque entier du tableau... et paf, 3 ECTS :D

Post nº15 (id3303) envoyé par patrick  le 04 Sep 2007, 09:56
Voici ma question de ce matin:

On a trois classes A,B,C. A et B sont liées par un lien d'association et B et C sont liées par un lien de composition. Il donne ensuite un diagramme de séquence du genre:
" "a:A" "b:B" "c:C
" "|" "|" "|
" "|___faireB()________ >|___faireC()_______>|
" "|" "|" "|
" "|___________________> X ----------------->X
" "|" "|" "|

(rem:les fleches du bas indique qu'on effectue une procedure d'éliminationd es objets)

Question: donnez le code java représenté par ce diagramme de classe et de séquence. Expliquez la procedure l'élimination des objets.

Alors pour le diagramme UML , voir cours. Pour la procedure de suppression il faut dire qu'on invoque explicitement le garbage collector depuis A pour supprimer B avec finalize() et comme C est lié à B par un lien de composition, il sera éliminé qd B le sera. Mais Bersini veut savoir comment ca se passe dans la memoire cad comment peut on etre sure que tous les referents de l'objet B et de l'objet C seront éliminé!!
En somme il faut dire que pour l'objet C, comme il est instancié et crée dans c, tous ses referents sont assurée de disparaitre avec l'objet B. Mais pour le referent B on ne sait pas car il n'est que déclarer dans A(cf lien association).
Voila vla...

Post nº14 (id3302) envoyé par patrick  le 04 Sep 2007, 09:53
Voici ma question de ce matin:

On a trois classes A,B,C. A et B sont liées par un lien d'association et B et C sont liées par un lien de composition. Il donne ensuite un diagramme de séquence du genre:
a:A b:B c:C
| | |
|___faireB()________ >|___faireC()________|
| | |
|___________________> X ----------------->X
| | |

(rem:les fleches du bas indique qu'on effectue une procedure d'éliminationd es objets)

Question: donnez le code java représenté par ce diagramme de classe et de séquence. Expliquez la procedure l'élimination des objets.

Alors pour le diagramme UML , voir cours. Pour la procedure de suppression il faut dire qu'on invoque explicitement le garbage collector depuis A pour supprimer B avec finalize() et comme C est lié à B par un lien de composition, il sera éliminé qd B le sera. Mais Bersini veut savoir comment ca se passe dans la memoire cad comment peut on etre sure que tous les referents de l'objet B et de l'objet C seront éliminé!!
En somme il faut dire que pour l'objet C, comme il est instancié et crée dans c, tous ses referents sont assurée de disparaitre avec l'objet B. Mais pour le referent B on ne sait pas car il n'est que déclarer dans A(cf lien association).
Voila vla...

Post nº13 (id2714) envoyé par Slob  le 02 May 2007, 12:50
Il écrit au tableau:

public class A
{
private int a;
public A(int a)
{
this.a=a;
}
public void IncA()
{
a++;
}
}

public class Principale
{
public void Inc(int b)
{
b++;
}
public static void main(String []args)
{
A a=new A(5);
int b=5;
a.IncA();
Inc(b);
}
}

Et la question était: que vaut l'entier dans a et que vaut l'entier b?

Il fallait penser au fait que dans java, tout objet est passé par référence SAUF les objets de type primitif...comme notre entier b qui est passé par valeur. Bref, "a"=6 tandis que b=5.
J'ai très bien pu lui expliquer tout ce qui se passait, mais je n'ai pas pensé sur le moment à la particularité des objets primitifs. Il m'a laissé mariner pendant 10min puis m'a dit que je n'avais rien compris aux bases de la programmation OO. Je ne vois toujours pas en quoi cette question démontre la connaissance de l'OO, d'après moi, c'est une particularité du language JAVA.

GOOD LUCK, car ça se joue à ça.

Post nº12 (id2712) envoyé par Fluffzor  le 21 Apr 2007, 15:23
alors moi j'ai eu, après la défense du projet :

2 classes A et B, avec une association (ou dépendance je sais plus)

la classe A possède donc un objet de type B

ensuite il instancie 1 objet de A et m'a demandé comment faire une copie de a ? et quels problèmes peuvent survenir.

J'ai dis qu'il fallait utiliser la méthode clone() de la classe objet

il m'a demandé de faire un petit dessin pour expliquer ce qu'il se passait dans la mémoire, là j'ai un peu cafouillé mais il fallait simplement faire un objet a1 qui pointait vers un objet b.

ensuite un objet a2 mais qui pointe vers le même objet b <= c'est là que ça peut etre embetant donc comment faire pour avoir 2 trucs indépendants (clonage en profondeur quoi...)

bon bin là denouveau un peu lent à la détente moi...
pour me mettre sur la voie il me dit
"qu'est ce que java incite de faire?"
"bon dans la classe objet, la méthode clone est protected, (c quoi protected il me demande)"

tout ça pour que je lui sorte qu'il fallait redéfinir la méthode clone dans la classe A
avec un b2=b.clone() ou qqch du genre

il m'a dit "ah bin on y est arrivé c'est bon , ok!"

bye bye

A noter que le tout premier type a être entré à simplement eu 2 classes A et B (B fille de A) et du écrire les classes... (le mot magique était extends) il est resté 3 min...

y a également eu des histoires de polymorphisme (joueur = gardien...) et de garbage

aussi des histoires sur les interfaces et enfin une question sur le multithreading

bref en arrivant et en discutant avec le premier gars on se dit : "ahaha berber les doigts dans le pif" et puis c'est plutot lui qui nous passe à la broche...

note : il file pas les points

Post nº11 (id2453) envoyé par Titi  le 31 Aug 2006, 20:34
hello,
alors g eut:
on a 3 classes:A,B,C et une interface IA
la classe C a un lien de composition vers la classe A.La classe B hérite de A et implémente l'interface IA.
Ds l'interface IA il y a une méthode faire A.
Pour cki est du diag de séquence on a un envoi de message de C sur un objet c vers B sur un objet b.

coder ça en java et faire un envoi de message ss voir B(doffice si ya une interface c pas fait pour les chiens:))...
en gros faut créer une méthode faire C ds C ou a lintérieur ya faire A et lappeler du main et introduire le lien de composition avec la classe A mais ça c texto ds le bookin,on crée un objet ds le constructeur grâce au new en tenant compte du principe de substitution(superclasse peut tout faire donc le typage statik de lobjet B peut être du type superclasse)...
voila je crois kya pas grd chose dautre a expliker,la dessus vous pouvez lui faire un joli 'ti baratin concernant lintérêt des interfaces et sur le principe de substitution comme ça vous lui montrer ke vous avez lu son passionnant boukin avec son humour bien lourdeau..enfin soit:p

Post nº10 (id2451) envoyé par anonyme  le 30 Aug 2006, 22:44
Salut j'ai passé l'exam ce matin et voici la question qui m'a été posée:

Bersini m'a donné un diagramme de classe et un diagramme de séquence et il voulait que je lui explique ce à quoi ça correspondait en lignes de code...

Diagramme de classe :
--> un classe A ayant un lien de composition avec une classe abstraite B
--> 3 classe C, D et E qui héritent de B
--> la classe D contient une methode faireD()

--> Cas évident de POLYMORPHISME

Diagramme de séquence

A:a
|
| ---------> D:d
| |
| |
| faireD() |
|------------>|
| |

Le diagramme de séquence est un peu bizarre ( flèche du haut ) mais ça correspond juste au fait que la classe A possède une méthode qui crée un objet de la classe D
La flèche du bas représente, comme dans le cours, à un envoi de message


Commençons par le plus simple

public class C extends B
{
public C() {}
}

idem pour la classe E

public class D extends B
{
public D() {}
public void faireD() {}
}

public abstract class B()
{
public B() {}
}

Pour la création de l'objet de la classe D, j'avais choisi de le faire dans le constructeur de la classe A ...

public class A()
{
private B unB;
public A()
{
unB=new D();
}
public void envoiMessage()
{
(D)unB.faireD(); //je suis pas sûr de cette ligne....
}
}

ATTENTION !!!! Je ne suis pas sûr que la méthode envoiMessage() est correcte....

En effet je suis parvenu à tout lui expliquer correctement jusqu'à la ligne unB=newD() sur laquelle j'ai coincé...

Je suis parti en vrille avec le casting ou je ne sais plus quoi car la classe B est abstraite et qu'elle ne peut donc pas créer d'objet et donc il fallait créer directement un objet de la classe D mais je voyais plus très bien comment il fallait écrire ça correctement ....--> après cinq grosses minutes de réflexion infructueuses, Bersini a interrompu l'exam ( je crois que les 20-25 minutes d'exam étaient passées ).Il m'a dit qu'il me mettait 11, m'a donné la bonne ligne de code et m'a annoncé que j'avais rien compris au polymorphisme!!!!!!!!!!!!!!!!!!.......

Voila... j'étais le premier à passer... le deuxième a eu la même question que moi et je crois que la troisième personne a reçu un bout de code à corriger et à compléter....

J'espère que j'ai été clair dans mes explications.... et bon courage à ceux qui doivent encore passer cet exam....






Post nº9 (id1558) envoyé par none  le 05 Sep 2005, 19:33
La question commence par un diagramme UML avec une class B qui hérite d'une class A et qui a un lien de composition avec une classe C. Il demande le squelette du code en C++ et en Java du diagramme.
Puis il pose plein de petites questions sur le garbage collector et des trucs du genre.
Attention, Mr Bersini se dit que nous metrisons le C++, donc les erreurs de syntaxe, les hésitations sur le code ( pointeurs et autre) sont considérés comme inacceptable.

Post nº8 (id1551) envoyé par un bavar.... ois...  le 03 Sep 2005, 16:34
Une petite erreur dans le post précédent. Pour le cas (2), le problème est signalé à la compilation et on force le compilateur dans (3) à accepter ce genre de truc car nous, programmeurs intelligents savons que cela ne posera pas de problème.

Post nº7 (id1550) envoyé par Un bavare.  le 03 Sep 2005, 15:17
Il ma dessicné un schéma UML au tableau. Une classe A dont hérite une classe B qui est elle-même composée d'une class C.

Il écrit ensuite ( sur ses grandes feuilles de papier cul ) :

void static main()
{
A a1 = new A();
A a2 = new A();
B b1 = new B();
B b2 = new B();

a1 = a2; //(1)
b1 = a2; //(2)
a1 = b1; //(3)
b1 = b2; //(4)
}

Il demande alors si tout est correcte et qu'est-ce qu'il se passe à la compilation et à l'exécution.

(1) La ligne est correcte, le référent a1 pointait vers un certain objet, en écrivant cette ligne, on le fait pointer vers l'objet vers lequel pointait a2. Comme il n'y a plus de référent qui pointait vers l'objet vers lequel a1 pointait précédemment, le garbage collector intervient et il disparait de la mémoire.
(2) Cette ligne est fausse car tout ce que sait faire un objet provenant de la classe B, un objet de la classe A ne sait pas le faire. Ainsi si j'executais une méthodeB sur b1 qui pointe en réalité sur a2, il y aura un problème. Il est signalé à l'exécution. => on retire cette ligne.
(3) Cette ligne est bonne ( raisonnement similaire au précédant mais ici cela ira ). Il nécessite néanmoins un casting afin que le compilateur la laisse passer: a1=(A)b1. On peut parler également des "Instance of" pour vérifier que le casting donnera qqch de correcte.
(4) Le pointeur b1 pointe vers un certain objet 1 et on le fait pointer vers un autre. Comme cet objet 1 est référencé également par a1 le garbage collecteur n'agira pas. On peut alors dévier sur le garbage collecteur en général.

Ensuite, il m'a demandé d'expliquer ce qu'était un clone et écrire succintement un bout de code sur cela. C'est dans le livre tel quel.

Je me suis trompé à la deuxième ligne (2), j'ai parlé du fait qu'égaler deux objets de classe différente ( dont l'une hérite de l'autre ) avec une phrase telle que b=a ne posait pas de problème car b était plus grand que a, a était contenu dans b. Il m'a alors demandé ce qu'il advenait des anciennes valeurs de B auquelles rien ne correspond dans la classe A... et m'a remis sur la voie correcte. :-). J'ai rattrapé le coup et suis sorti avec 14. Ahhh le stress...

Les cotes des personnes qui nous précédaient, moi et Mitch... : 16,16,17. Il leur a posé le même genre de petites questions. Il y en a une qui n'était pas passé ici, c'est avec la création d'objet selon différents constructeurs et la mémoire sur laquelle les objets ont été créé ( pile ou tas ) mais je ne suis pas sur, c'était tout aussi simple apparemment.

Il est vraiment cool mais ayez compris les principes de base et la réponse à ces questions-ci :-).

Post nº6 (id1548) envoyé par mitch  le 02 Sep 2005, 16:29
bon, j'arrive... c'est le méga bordel dans son bureau :p

on passe l'oral sur des feuilles de papier-cul géantes sur lesquelles il faut écrire avec des stiff qui transpercent au travers de 4 pages :p

donc, il me tape 2 classes A et B dans lesquelles il tape des attributs et des constructeurs.

il me demande ce qui se passe pour a1 = a2 (de la classe A), donc attributs pointant le mm objet, et il me demande ce que ça fait au niveau de la mémoire et ce que fait le garbage collecteur. Il faut donc dessiner les pointeurs et montrer ce que le garbage collector fait.
ensuite, il me demande comme dans un des poste précédents comment faire -je sais plus quoi- , en gros, il voulait que je clone mon a2 que g fait comme ça: a1=a2.clone()
il me demande ce qui doit se passer au niveau de la déclaration des méthodes (là g t paumé) et le réponse: redéfinir la méthode de clonage dans la classe A.

il me demande après ce qui passait au niveau de la mémoire lorsque le clonage a été effectué (et là, c t l'embrouille de nouveau) et je me souviens plus de la réponse :p

En gros, mon exam était bcp (trop?) axé sur la gestion de mémoire, de la compréhension basique hardcore, quoi... mais je mattendais vraiment pas à ça :s


au final, je suis ressorti avec seulement 10 car javais trop calé sur ses bêtes trucs de mémoires.
mais sinon, encore une fois, il est vraiment sympa et ya mm moyen de se marrer avec lui:p donc stressez mais avec modération paske transpirer dans son costard, c marrant mais ça aide pas bcp pour réfléchir:p

Post nº5 (id1544) envoyé par Stofigo  le 01 Sep 2005, 21:25
Hello

Mister Bersini m'a fait cadeau de 2 class: A et B, avec pour la B des attributs qcqs mais surtout une belle methode private void faireB().
La question: comment faire une association entre A et B qui utilise faireB?
Il fallait betement creer une methode public dans la class B genre:
public void faireautreB(){faireB()}
Ensuite il m'a demande quelle etait l'utilite d'avoir des methode privees, cf cours.
Pour finir il voulait savoir quelle etait l'etape superieur dans ce context, et c'etait l'interface. J'ai du lui ecrire le petit bout de code correspondant (quasi celui de "ou pas")et c'etait regle.
Bersinin est sympas et a pas l'air de se prendre la tete. Il veut meme bien faire l'effort de comprendre votre charabiat pour vous le reexpliquer.
J'ai pas toujours ete clair et j'ai fait qqs erreurs dans le code pourtant je sors avec 12.
Comprenez bien les notions et si en plus vous avez un peu de programmation dans les doigts, c'est dans la poche.

Post nº4 (id1543) envoyé par you you  le 01 Sep 2005, 17:00
Il m'a donné un programme avec des problèmes de casting et il demande de corriger,dire se qui se passe au niveau de l'allocation de la mémoire,etc donc il faut bien piger le garbage collector.Aussi qu'est ce qui se passe à la compilation, exécution.
Sinon il est sympa pour les points

Post nº3 (id1542) envoyé par ou pas  le 01 Sep 2005, 16:15
hello a tous on se bouscule pour donner ses question a ce que je vois...
bon il ma fait un petit diagramme UML juste deux classe d'une l'une herite de l'autre et avec redefinition de methode ds la classe fille.
ensuite il a ecrit des ligne de code et ma demander d'expliquer ce qu'il se passait (A= classe mere, B classe fille, faire() methode diff ds chaque classe)

1 A a= new A()
2 A b= new B()
3 B c= new A() ici il y a erreur de compilation pcq B ne peut etre egale a A cfr la classe fille fait plus de chose que la classe mere
4 B d= new B()
5 a.faire() methode de A
6 b.faire() methode de B
7 c.faire()//a supprimer
8 d.faire() methode de B

a quoi ca sert de faire l'instruction 2= polymorphisme, cfr l'exemple du bouquin avec les joueur de foot (le vecteur de joueur)
ensuite il ma demander c'est quoi la diff entre interface et classe abstract
et la on est parti ds les interfaces
il ma demander de coder une classe A qui interagi avec B sans voir B
j'ai rien compris sur le moment il ma bcq aider et si j'ai bien compris il faut faire comme ca

Class A{
methodeA( IB un lienB){
methodeB
}

IB = interface de B
mais lsq on appel la methodeA un lui passe en argument un objet B
puis il ma demander dans quelle classe est redefini methode B ( je crois que c'est dans la classe B, pas sur)

bilan 14/20
sur ce en esperant que d'autre suivront le mouvement

nb: l'exam se passe ds son bureau un par un 20-25 min par personne. il n'est pas stressant assez sympa c'est un dialogue entre lui et vous pour voir si vous avez compris comment ca se passe en java.
bonne m---- a tous ++

bien a vous ou pas




Post nº2 (id699) envoyé par anonyme  le 27 Aug 2004, 11:34
je viens de sortir de bersini. c'est tres cool comme exam.

Vu que j'entrait avec un 11 en 1ere sess, il m'a a peine demandé deux lignes de code pour l'envoi de messages. Attention, il te donne le "main", et en fonction de l'appel qu'il fait, tu dois ecrire le code du message dans les classes A et B (soit par arguments, soit par attribut).
Ensuite, il m'ecrit a1=a2 dans le "main" et il demande ce que ca fait (=> copie du referent). Alors il demande comment on fait pour alloué un nouvel espace memoire en gardant a1=a2. la g un peu patauge mais c tout con il faut faire un clone, avec un cast, car la methode clone est une methode de la classe Object: a1=(A)a2.clone (un truc com ca)

Puis, il demande si g une idee de comment on fait pour cloner egalement l'objet b2 vers lequel pointe a2. ...heu... bref ca il m'a expliqué mais ca reste flou dans mon cerveau.
Au final, il me donne 14, alors que le precedent qui rentrait avec 2 en premiere sess s'est pris un 7 a l'oral ! Donc attention, il cote un peu a la tete du client...

Post nº1 (id698) envoyé par anonyme  le 27 Aug 2004, 11:13
moi suis en électromec, je viens d'avoir Bersini:

il dessine un schema UML et vous devez ecrire le code correspondant.
Faut juste les grands principes, il met assez bien sur la voie pour que vous
codiez ce qu'il vous demande...
Moi j'ai un peu pataugé avec les envois de messages mais il m'a mit 13.
Y a donc facilement moyen de faire des points.


oraux.pnzone.net - infos - 84ms