Annonce : vous pouvez désormais vous abonner par mail au blog !

Profilage de code & fraude fiscale

Publié le 23 janvier 2019 par Gee dans Tu sais quoi ?
Inclus dans le livre Grise Bouille, Tome IV

Comment ça, « ça n’a rien à voir » ?

Bon, vous l’aurez compris, on va causer à la fois informatique et politique… et j’vais encore être grossier, mais ils m’énervent à la fin, avec leurs conneries. Rooogn’tudju.

Profilage de code & fraude fiscale

💡 Pour celles et ceux qui l'ignorent, lorsque je ne gri(se)bouille pas, je suis développeur informatique.

Gee, une guitare à la main, chante à tue-tête : « Inniénieeur informaticieeeeeen ! Ze suuiiiis inniéniiieeur informaticiee-een ! » Le smiley commente : « L'usage d'un mème de plus de 20 ans fait officiellement de toi un vieux con, Gee. »

Je ne vais pas vous expliquer en long en large et en travers, mais en gros, mon boulot, ça consiste à faire ça :

Concevoir un algorithme (j'en parle dans « Panique algorithmique ») ; écrire un programme qui le réalise (j'en parle dans « Des zéros et des uns ») ; débuguer le programme s'il ne fonctionne pas comme prévu (j'en parle dans « Le bug dans tous ses états ») ; profiler et optimiser le programme s'il est trop lent ou trop gourmand en mémoire. Le smiley ricane : « Tu vas pas nous l'expliquer en long en large parce que tu l'as déjà fait, en fait. »

Une partie que j'ai jamais évoquée est l'optimisation, qui consiste à essayer de faire la même chose en utilisant moins de ressources (dans un programme, les ressources se résument surtout au temps et à la mémoire utilisée).

Avant d'optimiser quoi que ce soit, il existe une étape très importante (et parfois sous-estimée) qui consiste à bien identifier les parties qui consomment effectivement trop de ressources : on appelle ça le profilage de code (francisation de « code profiling » en anglais).

Une bande-annonce : ce soir dans « Esprits Criminels »… Deux flics interrogent un programme. Le mauvais flic : « Pourquoi t'as mis 3 heures à t'exécuter, hein ? Il t'a servi à quoi, tout ce temps passé sur le processeur ? » Le bon flic : « Si tu te mets à table, le juge des prud'apps sera clément avec toi… » Le smiley rigole : « Une illustration plus réaliste, ce serait Gee le cul posé sur une chaise face à un ordi, mais c'est un peu le cas tout le temps… »

Imaginons donc que quelqu'un utilise un programme qui se compose de deux fonctions :

Les programmes sont « toto() » et « tata() ». Le smiley est blasé : « Notez les trésors d'imagination déployés pour les noms de ces fonctions. »

Ce programme est très lent, il prend une heure pour tourner. Il faut donc l'optimiser, réécrire ses fonctions d'une manière plus efficace et plus intelligente pour qu'il s'exécute et produise le même résultat en moins de temps.

Pour une raison que l'on ignore, la développeuse de ce programme s'acharne sur tata() dans l'espoir de l'optimiser.

La Geekette, derrière son ordi, se justifie : « C'est pavlovien, c'est juste que j'ai jamais pu encadrer ma tante. » Le smiley : « Ouais, ou plus probablement : la fonction tata() est plus simple à optimiser que la fonction toto() . Oui, les dévs sont des branlos. »

💡 À un moment donné, notre développeuse a un éclair de génie et se dit qu'elle devrait d'abord chronométrer les deux fonctions, au cas où…

Toto s'exclame : « 54 minutes ! » Tata : « 6 minutes ! » La Geekette est désespérée : « Enfer et damnation ! Je me fourvoyais ! Ça n'était point tata() mais toto() qui était le plus gourmand ! J'enrage, morbleu !  Comment pus-je être si sotte ? » Le smiley fait semblant de chialer : « Ce sens du mélodrame dans les dialogues, c'est émouvant… »

Eh oui ! Le programme passe en fait 90 % du temps dans la fonction toto() ! Il est donc parfaitement contre-productif de s'acharner à optimiser tata() !

Examinons plusieurs cas possibles :

Un tableau montre plusieurs case. Si j'optimise tata() et que je n'arrive qu'à une optimisation bof (disons 15 %) : tata() ne prend plus que 5 minutes, je gagne 1 minute. Si j'arrive à une optimisation géniale (99,99 %), tata() ne prend quasiment plus rien, je gagne 6 minutes. Si j'optimise toto() et que je n'arrive qu'à une optimisation bof (disons 15 %) : toto() ne prend plus que 45 minutes, je gagne 8 minutes. Si j'arrive à une optimisation géniale (99,99 %), toto() ne prend quasiment plus rien, je gagne 54 minutes.

La Geekette regarde le tableau et commente : « Si je travaille à réduire tata() , même si je suis incroyablement efficace, je ne peux gagner que 6 minutes au mieux. Si je travaille à réduire toto() , même si je ne suis efficace qu'à 15 %, je gagne déjà plus que temps total de tata() ! Et si je suis très efficace, je peux diviser le temps total pris par mon programme par 10 ! »

Comment optimiser une fonction dépend énormément de ce qu'on y trouve, je ne détaille donc pas pour l'instant.

Un jour, je vous causerai de complexité algorithmique, mais ça nécessitera un article à part entière…

Le smiley ricane : « Ah, toi aussi t'as une amie qui s'appelle Aude Loguène ? #BlagueDeMatheux »

On pourrait aussi imaginer qu'en prétraitant les données d'une certaine manière (avec une fonction additionnelle tutu() ), toto() deviendrait plus efficace.

Tutu dit : « J'ai trié les données de toto() , ça m'a pris 10 minutes. » Toto : « Cool ! Du coup au lieu de prendre 54 minutes, j'en ai pris 20 !   » Tata : « Moi ça va, j'ai pas bougé. » Elle ajoute pour Toto : « Tu connais la blague de toi-même aux WC ? »

La Geekette explique, contente : « On perd 10 minutes en prétraitement, mais on en gagne 34 ensuite. On a donc un gain global de 24 minutes, soit 40 % du temps total pris par le programme. On a presque divisé le temps d'exécution par 2 ! »

Quant à tata(), il deviendrait éventuellement intéressant de s'y attaquer si toto() devenait très rapide.

Toto : « Je ne prends plus que 2 minutes pour m'exécuter. » Tata : « Moi j'ai pas bougé. » La Geekette explique : « tata() prend toujours 6 minutes, mais ça représente maintenant 75 % du temps de calcul – 8 minutes au total. Désormais, ça a du sens de s'y attaquer. »

💡 Imaginons maintenant que nous ayons un budget à gérer (au hasard, celui de l'État) et que nous ayons identifié plusieurs causes de pertes d'argent.

La fraude fiscale représente 70 milliards d'euros par an, la fraude sociale (fraude aux allocations sociales comprenant fraude au RSA, à l'assurance maladie, aux allocations chômage, etc.) 4 milliards d'euros par an. Gee montre le graphique en disant : « Exemple choisi totalement au hasard bien sûr. On parle de proportions de 95 % et 5 % du total respectivement. »

Eh bien, voyez-vous, dans ce contexte, si quelqu'un s'évertuait à lutter contre la fraude aux allocations sociales et ignorait totalement la fraude fiscale, on serait en droit de le considérer comme le roi des cons.

Le smiley confirme : « Moi en tout cas, j'aimerais pas avoir un baltringue pareil à la tête de l'État. »

Et si ce roi des cons balançait carrément un pognon de dingue dans la lutte contre la fraude aux allocs en multipliant (par exemple) les contrôles à Pôle Emploi, on serait carrément en droit de le considérer comme l'Empereur Galactique des abrutis.

(En plus d'être un salopard qui s'attaquerait d'abord à la fraude des très pauvres – pratiquée, en général, pour moins galérer – plutôt qu'à la fraude des très riches — pratiquée, en général, pour s'acheter un yacht plus grand. Mais c'est pas le sujet.)

Gee se facepalm : « Lutter contre les fraudeurs aux allocs pour réduire le déficit, c'est un peu comme si la fonction tutu() prétraitait les données pour tata() au lieu de celles pour toto(). Et vu que tutu() prend 10 minutes et que tata() en prend 6, dans le MEILLEUR des cas, on PERD 4 minutes, hein. Au pire, on en perd 10… Moi, si j'bosse comme ça, on m'fout dehors à coups de pied dans le derche. » Le smiley prend un air mauvais : « Ouais, mais faudrait pas que tata() prenne la confiance, cette feignasse. »

Alors que si on faisait une fonction tutu() effectivement dédiée à réduire toto(), on dépenserait peut-être un peu plus (en contrôleurs fiscaux supplémentaires engagés), mais on aurait des chances de gagner très gros, même si on était peu efficaces !

Gee s'exclame : « Il suffirait de réduire la fraude fiscale de 6 % pour gagner plus que l'ensemble de la fraude aux allocs ! » Le smiley, énervé : « Et si on approchait des 100 % de réduction de la fraude fiscale, au passage… je vous rappelle que le déficit de l'État en France est de 70 milliards…  J'dis ça, j'dis rien. »

Bon, vous allez me dire : oui, mais on pourrait aussi dépenser moins. Réduire les services publics, les pensions de retraite, les allocations chômage, tout ça…

L'équivalent, dans l'analogie du programme, ce serait tout simplement de choisir de faire un programme qui fait moins de choses (ou moins bien) pour que le coût décroisse de lui-même.

Mais j'avais cru comprendre que, dans le contexte actuel, ça semblait plutôt être une solution de pourriture cynique malvenue.

Une foule en colère avec des pancartes : « personnel médical en burn-out », « retraités sous le seuil de pauvreté », « territoires désertés par les services publics ». Une manifestante grommelle : « Vas-y, essaie un peu pour voir… » Le smiley, un cigare à la bouche, remarque : « 'sont grogons, ces pauvres… »

Bref, dans le contexte actuel, une conclusion s'impose :

Tout projet de réduction des déficits qui ne serait pas focalisé sur la fraude fiscale devrait être considéré comme nul et non avenu.

Tant que la fraude fiscale représentera plus que 4 milliards d'euros, ça n'aura aucun intérêt économique de s'attaquer à la fraude aux allocs.

Gee indique : « Et encore, là on n'parle que de la fraude, c'est-à-dire de fumiers de délinquants qui ne respectent pas la loi et ne paient pas les impôts qu'ils doivent. Après, on pourrait aussi s'attaquer à “l'optimisation fiscale” et à toutes les niches qui permettent à ce genre d'aberration de se produire dans le feutré. » Un revenu montre que le taux global d'imposition stagne après le revenu médian et diminue pour les plus riches.

(Graphique basé sur https://revolution-fiscale.fr de Camille Landais, Thomas Piketty et Emmanuel Saez.)

Pour conclure, avant de demander aux gens s'ils préfèrent qu'on augmente les impôts ou qu'on dégrade encore plus les services publics, il faudrait déjà s'assurer que tout le monde paie déjà les impôts qui existent.

Allez, pour l'emphase, répétons encore une fois tous en chœurs :

Tout projet de réduction des déficits qui ne serait pas focalisé sur la fraude fiscale devrait être considéré comme nul et non avenu.

Le smiley conclue : « Bisous Manu. J'ai le droit, j'ai un diplôme et je me nourris moi-même. » Note : BD sous licence CC BY SA (grisebouille.net), dessinée le 22 janvier 2019 par Gee.

Publié le 23 janvier 2019 par Gee dans Tu sais quoi ?

🛈 Si vous avez aimé cet article, vous pouvez le retrouver dans le livre Grise Bouille, Tome IV.

Soutenir

Ce blog est publié sous licence libre, il est librement copiable, partageable, modifiable et réutilisable. Il est gratuit car financé principalement par vos dons. Sans inscription, vous pouvez très simplement me soutenir :

Pour l'année 2023-2024, 9 796 € ont pour l'instant été collectés sur un objectif annuel de 21 000 € (SMIC brut), soit 47 % de l'objectif :

Sources de revenu

L'année étant entamée à 65 %, il y a actuellement un retard de 3 854 € sur l'objectif.

Avancement de l'année

Vous pouvez également, si vous le souhaitez, passer par une plateforme de financement participatif :