Table des matières
Motivation et raisons du projet Valhalla
Types de valeur Le concept de types de valeur
Specialized Generics 专用泛型
Conclusion
Maison Java javaDidacticiel Parlons du projet Java Valhalla

Parlons du projet Java Valhalla

Sep 07, 2022 pm 02:07 PM
java

Cet article vous apporte des connaissances pertinentes sur java, qui présente principalement l'introduction du projet Java Valhalla et une introduction détaillée autour du thème. Examinons-le ensemble, j'espère qu'il sera utile à tout le monde.

Parlons du projet Java Valhalla

Étude recommandée : "Tutoriel vidéo Java"

Dans cet article, nous présenterons le projet Valhalla - ses raisons historiques, son état de développement actuel et ce qu'il a apporté aux développeurs Java quotidiens après sa sortie Quoi.

Motivation et raisons du projet Valhalla

L'architecte du langage Java d'Oracle, Brian Goetz, a déclaré dans un discours que l'une des principales motivations du projet Valhalla est le désir d'adapter le langage et le runtime Java au matériel moderne. Lorsque le langage Java est né (au moment de la rédaction de cet article il y a environ 25 ans), l'accès à la mémoire et les opérations arithmétiques coûtaient à peu près le même prix.

Aujourd'hui, cette situation a changé, les opérations de récupération de mémoire sont 200 à 1000 fois plus coûteuses que les opérations arithmétiques. En termes de conception du langage, cela signifie que les opérations indirectes entraînant des extractions de pointeurs peuvent nuire aux performances globales.

Étant donné que la plupart des structures de données Java dans une application sont des objets, nous pouvons considérer Java comme un langage à forte intensité de pointeurs (même si nous ne les voyons ou ne les manipulons généralement pas directement). Cette implémentation d'objet basée sur un pointeur est utilisée pour permettre l'identification d'objet, qui elle-même est utilisée pour les fonctionnalités du langage telles que le polymorphisme, la mutabilité et le verrouillage. Par défaut, ces propriétés s'appliquent à chaque objet, qu'elles soient réellement nécessaires ou non.

Suite à la chaîne d'identités menant aux pointeurs et à la chaîne de pointeurs menant à l'indirection, l'indirection présente un inconvénient de performances et la conclusion logique est de supprimer les structures de données qui n'en ont pas besoin. C’est là que les types valeur entrent en jeu.

Types de valeur Le concept de types de valeur

est de représenter une pure agrégation de données. Cela supprime les fonctionnalités des objets normaux. Nous avons donc des données pures, pas d'identité. Bien entendu, cela signifie que nous perdons également la fonctionnalité qui peut être obtenue grâce à l'identification d'objets. Par conséquent, les comparaisons d’égalité ne peuvent être effectuées que sur la base du statut. Par conséquent, nous ne pouvons pas utiliser le polymorphisme de représentation, ni utiliser d’objets immuables ou non nullables.

Puisque nous n'avons plus d'identité d'objet, nous pouvons abandonner les pointeurs et modifier la disposition générale de la mémoire des types valeur au lieu des objets. Comparons la disposition de la mémoire entre les points de classe et les points de type valeur correspondants.

Le code et la disposition de mémoire correspondante pour la classe Point normale seraient :

final class Point {
  final int x;
  final int y;
}
Copier après la connexion

D'autre part, le code et la disposition de mémoire correspondante pour le type de valeur Point seraient :

value class Point {
  int x;
  int y
}
Copier après la connexion

Cela permet aux types de valeurs JVM Flatten de se transformer en tableaux et objets, ainsi que d'autres types de valeurs.

Dans l'image ci-dessous, nous montrons les effets négatifs indirects lors de l'utilisation de la classe Point dans un tableau :

Par contre, nous voyons ici la correspondance du type de valeur Point[] Structure de la mémoire : <code>Point[]的相应内存结构:

它还使JVM能够在栈上传递值类型,而不必在堆上分配它们。最后,这意味着我们得到的数据聚合具有类似于Java原语的运行时行为,如intfloat

但与原语不同,值类型可以有方法和字段。我们还可以实现接口并将其用作泛型类型。

因此,我们可以从两个不同的角度来看值类型:

  • 更快的对象
  • 用户定义原语

作为额外的锦上添花,我们可以使用值类型作为泛型类型,而无需装箱。这直接将我们引向了另一个大型项目Valhalla的特性:专用泛型。

Specialized Generics 专用泛型

当我们想对语言原语进行泛化时,我们目前使用装箱类型,例如整数表示Integer或浮点表示Float。这种装箱创建了一个额外的间接层,从而首先破坏了使用原语提高性能的目的。

因此,我们在现有的框架和库中看到了许多针对基元类型的专门化,如IntStream<T>ToIntFunction<T>。这样做是为了保持使用原语的性能提高。

因此,专门化泛型是为了消除这些“黑客”的需求。相反,Java语言努力为基本上所有东西启用泛型类型:对象引用、原语、值类型,甚至可能是void

🎜🎜 Il permet également la JVM pour transmettre les types de valeurs sur la pile sans avoir à les allouer sur le tas. En fin de compte, cela signifie que nous obtenons des agrégations de données avec un comportement d'exécution similaire aux primitives Java comme int ou float. 🎜🎜Mais contrairement aux primitives, les types valeur peuvent avoir des méthodes et des champs. Nous pouvons également implémenter des interfaces et les utiliser comme types génériques. 🎜🎜🎜Nous pouvons donc examiner les types de valeurs sous deux angles différents : 🎜🎜
  • Objets plus rapides
  • Primitives définies par l'utilisateur
🎜 Comme cerise sur le gâteau le gâteau, nous pouvons utiliser des types valeur comme types génériques sans 🎜boxing🎜. Cela nous amène directement à une autre fonctionnalité du grand projet Valhalla : les génériques spécialisés. 🎜🎜Génériques spécialisés 🎜🎜Lorsque nous voulons généraliser les primitives du langage, nous utilisons actuellement des types encadrés, tels que la représentation entière Integer ou la représentation à virgule flottante Float. Ce boxing crée une couche supplémentaire d'indirection, allant ainsi à l'encontre de l'objectif premier de l'utilisation de primitives pour améliorer les performances. 🎜🎜Ainsi, nous voyons de nombreuses spécialisations pour les types primitifs dans les frameworks et bibliothèques existants, tels que IntStream<T> ou ToIntFunction<T>. Ceci est fait pour maintenir les améliorations de performances liées à l'utilisation de primitives. 🎜🎜La spécialisation des génériques, c'est donc éliminer le besoin de ces "hacks". Au lieu de cela, le langage Java s'efforce d'activer des types génériques pour pratiquement tout : les références d'objet, les primitives, les types valeur et peut-être même void. 🎜

Conclusion

Nous avons une compréhension préliminaire des changements que le projet Valhalla apportera au langage Java. Deux des principaux objectifs sont d’améliorer les performances et de réduire les fuites d’abstractions.

Les améliorations des performances sont apportées en aplatissant le graphique des objets et en supprimant l'indirection. Cela se traduit par une disposition de la mémoire plus efficace et moins d'allocations et de garbage collection.

Lorsqu'ils sont utilisés comme type générique, les primitives et les objets ont un comportement plus similaire, ce qui constitue une meilleure abstraction.

Apprentissage recommandé : "Tutoriel vidéo Java"

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

Video Face Swap

Video Face Swap

Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Nombre parfait en Java Nombre parfait en Java Aug 30, 2024 pm 04:28 PM

Guide du nombre parfait en Java. Nous discutons ici de la définition, comment vérifier le nombre parfait en Java ?, des exemples d'implémentation de code.

Weka en Java Weka en Java Aug 30, 2024 pm 04:28 PM

Guide de Weka en Java. Nous discutons ici de l'introduction, de la façon d'utiliser Weka Java, du type de plate-forme et des avantages avec des exemples.

Numéro de Smith en Java Numéro de Smith en Java Aug 30, 2024 pm 04:28 PM

Guide du nombre de Smith en Java. Nous discutons ici de la définition, comment vérifier le numéro Smith en Java ? exemple avec implémentation de code.

Questions d'entretien chez Java Spring Questions d'entretien chez Java Spring Aug 30, 2024 pm 04:29 PM

Dans cet article, nous avons conservé les questions d'entretien Java Spring les plus posées avec leurs réponses détaillées. Pour que vous puissiez réussir l'interview.

Break or Return of Java 8 Stream Forach? Break or Return of Java 8 Stream Forach? Feb 07, 2025 pm 12:09 PM

Java 8 présente l'API Stream, fournissant un moyen puissant et expressif de traiter les collections de données. Cependant, une question courante lors de l'utilisation du flux est: comment se casser ou revenir d'une opération FOREAK? Les boucles traditionnelles permettent une interruption ou un retour précoce, mais la méthode Foreach de Stream ne prend pas directement en charge cette méthode. Cet article expliquera les raisons et explorera des méthodes alternatives pour la mise en œuvre de terminaison prématurée dans les systèmes de traitement de flux. Lire plus approfondie: Améliorations de l'API Java Stream Comprendre le flux Forach La méthode foreach est une opération terminale qui effectue une opération sur chaque élément du flux. Son intention de conception est

Horodatage à ce jour en Java Horodatage à ce jour en Java Aug 30, 2024 pm 04:28 PM

Guide de TimeStamp to Date en Java. Ici, nous discutons également de l'introduction et de la façon de convertir l'horodatage en date en Java avec des exemples.

Programme Java pour trouver le volume de la capsule Programme Java pour trouver le volume de la capsule Feb 07, 2025 am 11:37 AM

Les capsules sont des figures géométriques tridimensionnelles, composées d'un cylindre et d'un hémisphère aux deux extrémités. Le volume de la capsule peut être calculé en ajoutant le volume du cylindre et le volume de l'hémisphère aux deux extrémités. Ce tutoriel discutera de la façon de calculer le volume d'une capsule donnée en Java en utilisant différentes méthodes. Formule de volume de capsule La formule du volume de la capsule est la suivante: Volume de capsule = volume cylindrique volume de deux hémisphères volume dans, R: Le rayon de l'hémisphère. H: La hauteur du cylindre (à l'exclusion de l'hémisphère). Exemple 1 entrer Rayon = 5 unités Hauteur = 10 unités Sortir Volume = 1570,8 unités cubes expliquer Calculer le volume à l'aide de la formule: Volume = π × r2 × h (4

Créer l'avenir : programmation Java pour les débutants absolus Créer l'avenir : programmation Java pour les débutants absolus Oct 13, 2024 pm 01:32 PM

Java est un langage de programmation populaire qui peut être appris aussi bien par les développeurs débutants que par les développeurs expérimentés. Ce didacticiel commence par les concepts de base et progresse vers des sujets avancés. Après avoir installé le kit de développement Java, vous pouvez vous entraîner à la programmation en créant un simple programme « Hello, World ! ». Une fois que vous avez compris le code, utilisez l'invite de commande pour compiler et exécuter le programme, et « Hello, World ! » s'affichera sur la console. L'apprentissage de Java commence votre parcours de programmation et, à mesure que votre maîtrise s'approfondit, vous pouvez créer des applications plus complexes.

See all articles