Κυκλοφορία της γλώσσας προγραμματισμού Julia 1.12

Δημοσιεύτηκε η έκδοση της γλώσσας προγραμματισμού Julia 1.12, η οποία συνδυάζει ιδιότητες όπως υψηλή απόδοση, υποστήριξη για δυναμική πληκτρολόγηση και ενσωματωμένα εργαλεία για παράλληλο προγραμματισμό. Η σύνταξη της Julia είναι κοντά στο MATLAB, δανειζόμενος κάποια στοιχεία από τους Ruby και Lisp. Η μέθοδος χειρισμού χορδών θυμίζει Perl. Ο κωδικός του έργου διανέμεται με την άδεια MIT.

Βασικά χαρακτηριστικά της γλώσσας:

  • Υψηλή απόδοση: ένας από τους βασικούς στόχους του έργου είναι η επίτευξη απόδοσης κοντά στα προγράμματα C. Ο μεταγλωττιστής Julia βασίζεται στην εργασία του έργου LLVM και δημιουργεί αποτελεσματικό εγγενή κώδικα μηχανής για πολλές πλατφόρμες-στόχους.
  • Υποστηρίζει διάφορα παραδείγματα προγραμματισμού, συμπεριλαμβανομένων στοιχείων αντικειμενοστρεφούς και λειτουργικού προγραμματισμού. Η τυπική βιβλιοθήκη παρέχει, μεταξύ άλλων, λειτουργίες για ασύγχρονη I/O, έλεγχο διεργασιών, καταγραφή, δημιουργία προφίλ και διαχείριση πακέτων.
  • Δυναμική πληκτρολόγηση: η γλώσσα δεν απαιτεί ρητό ορισμό τύπων για μεταβλητές, παρόμοιο με τις γλώσσες προγραμματισμού δέσμης ενεργειών. Υποστηρίζεται η διαδραστική λειτουργία.
  • Προαιρετική δυνατότητα ρητού προσδιορισμού τύπων.
  • Μια σύνταξη ιδανική για αριθμητικούς υπολογισμούς, επιστημονικούς υπολογισμούς, μηχανική μάθηση και οπτικοποίηση δεδομένων. Υποστήριξη πολλών τύπων αριθμητικών δεδομένων και εργαλείων για παραλληλοποίηση υπολογισμών.
  • Η δυνατότητα απευθείας κλήσης συναρτήσεων από βιβλιοθήκες C χωρίς πρόσθετα επίπεδα.

Σημαντικές αλλαγές στο Julia 1.12:

  • Νέα χαρακτηριστικά γλώσσας
    • Η πειραματική επιλογή "--trim" δημιουργεί πιο συμπαγή δυαδικά αρχεία αφαιρώντας κώδικα που δεν είναι προσβάσιμος από τα καθορισμένα σημεία εισόδου. Τα σημεία εισόδου μπορούν να επισημανθούν χρησιμοποιώντας το "Base.Experimental.entrypoint". Δεν λειτουργεί όλος ο κώδικας με αυτήν την επιλογή.
    • Οι σταθερές παρακάμψεις ορίζονται πλέον με σαφήνεια και ακολουθούν τη σημασιολογία της παγκόσμιας εποχής. Επιτρέπονται πρόσθετες παρακάμψεις (για παράδειγμα, τύπων).
    • Μια νέα παράμετρος "usings::Bool" έχει προστεθεί στη συνάρτηση "names", με αποτέλεσμα η συνάρτηση να επιστρέφει όλα τα ονόματα που είναι ορατά μέσω του "using".
    • Η οικογένεια μακροεντολών @atomic υποστηρίζει πλέον σύνταξη ανάθεσης αναφοράς, όπως @atomic :monotonic v[3] += 4, η οποία τροποποιεί ατομικά το v[3] με σημασιολογία μονοτονικής ταξινόμησης. Η υποστηριζόμενη σύνταξη περιλαμβάνει:
      • ατομική ανάγνωση ("x = @atomic v[3]"),
      • ατομική ανάθεση ("@atomic v[3] = 4"),
      • ατομική αλλαγή ("@atomic v[3] += 2"),
      • ατομική μοναδική ανάθεση ("@atomiconce v[3] = 2"),
      • ατομική ανταλλαγή ("x = @atomicswap v[3] = 2"),
      • ατομική αντικατάσταση ("x = @atomicreplace v[3] 2=>5").
    • Η νέα παράμετρος "--task-metrics=yes" επιτρέπει τη συλλογή πληροφοριών χρόνου εκτέλεσης για κάθε εργασία. Αυτή η παράμετρος μπορεί να ενεργοποιηθεί/απενεργοποιηθεί κατά τον χρόνο εκτέλεσης χρησιμοποιώντας το "Base.Experimental.task_metrics(::Bool)". Διαθέσιμες μετρήσεις:
      • ο πραγματικός χρόνος εκτέλεσης της εργασίας, συμπεριλαμβανομένης της μεταγλώττισης και της συλλογής απορριμμάτων ("Base.Experimental.task_running_time_ns"),
      • χρόνος από τη στιγμή που ξεκίνησε η ολοκλήρωση της εργασίας (“Base.Experimental.task_wall_time_ns”).
    • Υποστήριξη Unicode 16.
    • Το "Threads.@spawn" δέχεται πλέον το όρισμα ":samepool" για να καθορίσει την ίδια ομάδα νημάτων με τον κωδικό κλήσης. Το "Threads.@spawn :samepool foo()" είναι η συντομογραφία του "Threads.@spawn Threads.threadpool() foo()".
    • Η μακροεντολή "@ccall" μπορεί πλέον να δεχτεί ένα όρισμα "gc_safe". Εάν αυτό το όρισμα είναι αληθές, το περιβάλλον εκτέλεσης μπορεί να εκτελέσει συλλογή απορριμμάτων παράλληλα ενώ καλείται το "ccall".
  • Η γλώσσα αλλάζει
    • Όταν αντικαθίσταται μια μέθοδος με μια ισοδύναμη υπογραφή, η υπάρχουσα μέθοδος δεν διαγράφεται. Αντίθετα, η νέα μέθοδος έχει προτεραιότητα. Εάν η νέα μέθοδος διαγραφεί, η παλιά μέθοδος θα συνεχίσει να λειτουργεί. Αυτό είναι χρήσιμο, για παράδειγμα, σε πλαίσια δοκιμών mocking (SparseArrays, Pluto, Mocking, κ.λπ.), καθώς δεν υπάρχει ανάγκη ρητής επαναφοράς της παλιάς μεθόδου. Προς το παρόν, αυτή η κατάσταση απαιτεί επαναμεταγλώττιση, αλλά ενδέχεται να είναι δυνατή η επαναχρησιμοποίηση παλιών αποτελεσμάτων στο μέλλον.
    • Η επέκταση μακροεντολών δεν θα εισάγει πλέον αμέσως αναδρομικά εκφράσεις "Expr(:toplevel)" από μακροεντολές. Αντίθετα, η επέκταση ":toplevel" θα αναβάλλεται μέχρι το χρόνο εκτέλεσης. Αυτό επιτρέπει σε μεταγενέστερες εκφράσεις στο ίδιο ":toplevel" να χρησιμοποιούν μακροεντολές που έχουν οριστεί προηγουμένως.
    • Οι τετριμμένοι άπειροι βρόχοι (όπως "while true; end") δεν θεωρούνται πλέον απροσδιόριστη συμπεριφορά. Οι άπειροι βρόχοι που στην πραγματικότητα κάνουν κάτι (όπως με παρενέργειες ή ύπνο) δεν θεωρούνταν ποτέ και δεν θεωρούνται απροσδιόριστη συμπεριφορά.
    • Η ταυτόχρονη σήμανση ενός αναγνωριστικού ως "δημόσιο" και "εξαγωγή" αποτελεί πλέον σφάλμα.
    • Τα σφάλματα χρόνου εκτέλεσης στο "getfield" εμφανίζουν πλέον έναν νέο τύπο εξαίρεσης "FieldError" αντί για το γενικό "ErrorException".
    • Οι μακροεντολές στις δηλώσεις συναρτήσεων δεν απαιτούν πλέον παρενθέσεις. Για παράδειγμα, η συνάρτηση "function @main(args) … end" είναι πλέον αποδεκτή, ενώ προηγουμένως απαιτούνταν η συνάρτηση "function (@main)(args) … end".
    • Η κλήση της συνάρτησης "using" σε ένα όνομα πακέτου μέσα στο ίδιο το πακέτο (ιδιαίτερα σχετική με τις ένθετες ενότητες) χρησιμοποιεί πλέον ρητά αυτό το πακέτο χωρίς να εξετάζει το Manifest και το περιβάλλον, όπως ακριβώς και το "..Name". Αυτό ταιριάζει καλύτερα με την αναμενόμενη συμπεριφορά.
  • Βελτιώσεις μεταγλωττιστή/χρόνου εκτέλεσης
    • Ο ενδιάμεσος κώδικας (IR) που δημιουργείται από LLVM χρησιμοποιεί πλέον τύπους δεικτών αντί να μεταβιβάζει δείκτες ως ακέραιους αριθμούς. Αυτό επηρεάζει το "llvmcall": το ενσωματωμένο LLVM IR θα πρέπει να ενημερωθεί για να αντικαταστήσει τα "i32"/"i64" με "i8*" ή "ptr" και να αφαιρέσει τις περιττές μετατροπές "ptrtoint"/"inttoptr". Για λόγους συμβατότητας, το IR με ακέραιους δείκτες εξακολουθεί να υποστηρίζεται, αλλά παράγει μια προειδοποίηση.
  • Αλλαγές στις Επιλογές Γραμμής Εντολών
    • Η σημαία "-m/--module" μπορεί να μεταβιβαστεί για να εκτελεστεί η συνάρτηση "main" μέσα στο πακέτο με ένα σύνολο ορισμάτων. Αυτή η συνάρτηση πρέπει να δηλωθεί με "@main", που υποδεικνύει ότι είναι το σημείο εισόδου.
    • Η έξοδος χρώματος της Julia μπορεί πλέον να ενεργοποιηθεί ή να απενεργοποιηθεί χρησιμοποιώντας τις μεταβλητές περιβάλλοντος "NO_COLOR" και "FORCE_COLOR". Αυτές οι μεταβλητές τηρούνται επίσης από το σύστημα δημιουργίας της Julia.
    • Το "--project=@temp" ξεκινά την Julia με ένα προσωρινό περιβάλλον.
    • Η νέα επιλογή "--trace-compile-timing" εκτυπώνει τον χρόνο μεταγλώττισης κάθε εξόδου μεθόδου από το "--trace-compile" σε χιλιοστά του δευτερολέπτου.
    • Η συνάρτηση "--trace-compile" πλέον εκτυπώνει τις αναμεταγλωττισμένες μεθόδους με κίτρινο χρώμα ή προσθέτει ένα σχόλιο εάν το χρώμα δεν είναι διαθέσιμο.
    • Η νέα επιλογή "--trace-dispatch" εκτυπώνει μεθόδους που έχουν εκχωρηθεί δυναμικά.
  • Αλλαγές πολλαπλών νημάτων
    • Η Julia χρησιμοποιεί πλέον 1 "διαδραστικό" νήμα από προεπιλογή, εκτός από 1 κύριο νήμα "εργαζόμενου", δηλαδή "-t1,1". Αυτό σημαίνει ότι η κύρια εργασία και το REPL (σε διαδραστική λειτουργία), τα οποία εκτελούνται και τα δύο στο νήμα 1, εκτελούνται πλέον στην διαδραστική ομάδα. Ο βρόχος εισόδου/εξόδου του libuv εκτελείται επίσης στο νήμα 1, διασφαλίζοντας την αποτελεσματική χρήση της ομάδας εργασίας που χρησιμοποιείται από το "Threads.@spawn". Το αίτημα ακριβώς 1 νήματος ("-t1"/"JULIA_NUM_THREADS=1") ή 0 διαδραστικών νημάτων απενεργοποιεί το διαδραστικό νήμα: "-t1,0", "JULIA_NUM_THREADS=1,0" ή "-tauto,0". Το αίτημα περισσότερων από 1 νημάτων ενεργοποιεί το διαδραστικό νήμα. Για παράδειγμα, το "-t2" ισοδυναμεί με το "-t2,1". Υπενθυμίζεται ότι τα buffer δεν πρέπει να είναι συνδεδεμένα με το "threadid()".
    • Ορίζονται νέοι τύποι για πρότυπα κώδικα που θα πρέπει να εκτελούνται μία φορά ανά διεργασία—ο τύπος "OncePerProcess{T}" σάς επιτρέπει να ορίσετε μια συνάρτηση που θα εκτελείται ακριβώς μία φορά, την πρώτη φορά που θα καλείται, και στη συνέχεια θα επιστρέφει πάντα την ίδια τιμή τύπου "T" στις επόμενες κλήσεις. Υπάρχουν επίσης οι τύποι "OncePerThread{T}" και "OncePerTask{T}" για παρόμοια χρήση με νήματα ή εργασίες.
  • Δημιουργία αλλαγών συστήματος
    • Προστέθηκαν νέα αρχεία Makefiles για τη δημιουργία της Julia και του LLVM χρησιμοποιώντας το BOLT (Εργαλείο Δυαδικής Βελτιστοποίησης και Διάταξης). Δείτε "contrib/bolt" και "contrib/pgo-lto-bolt".
  • Νέες λειτουργίες βιβλιοθήκης
    • Η συνάρτηση "logrange(start, stop; length)" δημιουργεί ένα εύρος με σταθερή αναλογία αντί για σταθερό βήμα.
    • Η νέα συνάρτηση "isfull(c::Channel)" ελέγχει εάν η συνάρτηση "put!(c, some_value)" θα μπλοκάρει.
    • Οι συναρτήσεις "waitany(tasks; throw=false)" και "waitall(tasks; failfast=false, throw=false)" περιμένουν την ταυτόχρονη ολοκλήρωση πολλών εργασιών.
    • Το "uuid7()" δημιουργεί ένα UUID έκδοσης 7 που συμμορφώνεται με το RFC 9562.
    • Η συνάρτηση "insertdims(array; dims)" εισάγει διαστάσεις ενός στοιχείου σε έναν πίνακα—η αντίστροφη λειτουργία της συνάρτησης "dropdims".
    • Ο νέος τύπος "Fix" γενικεύει το "Fix1/Fix2" για να διορθώσει ένα μόνο όρισμα.
    • Η συνάρτηση "Sys.detectwsl()" ελέγχει εάν η Julia εκτελείται εντός WSL κατά τον χρόνο εκτέλεσης.
  • Νέες ευκαιρίες για τις βιβλιοθήκες
    • Το "escape_string" δέχεται τις πρόσθετες παραμέτρους "ascii=true" (για διαφυγή όλων των χαρακτήρων που δεν είναι ASCII) και "fullhex=true" (για χρήση πλήρους δεκαεξαδικής μορφής 4/8 ψηφίων σε u/U-escaping, π.χ. για συμβατότητα με C).
    • Το "tempname" μπορεί πλέον να δεχτεί μια συμβολοσειρά επιθήματος, έτσι ώστε το όνομα αρχείου να περιλαμβάνει αυτήν την κατάληξη και να λαμβάνεται υπόψη για τη μοναδικότητα.
    • Τα αντικείμενα RegexMatch μπορούν πλέον να χρησιμοποιηθούν για τη δημιουργία NamedTuple και Dict.
    • Η επιλογή "Κλειδώσιμο" είναι πλέον εξαγώγιμη.
    • Τα "Base.require_one_based_indexing" και "Base.has_offset_axes" είναι πλέον δημόσια.
    • Προστέθηκαν οι νέες συναρτήσεις "ltruncate", "rtruncate" και "ctruncate" για την περικοπή των συμβολοσειρών στο πλάτος του κειμένου, λαμβάνοντας υπόψη το πλάτος των χαρακτήρων.
    • Η συνάρτηση "isless" (και επομένως η "cmp", η ταξινόμηση, κ.λπ.) υποστηρίζεται πλέον για μηδενικής διάστασης "AbstractArray".
    • Η "invoke" επιτρέπει πλέον την διαβίβαση μιας "Μεθόδου" αντί για μια υπογραφή τύπου.
    • Το "invoke" δέχεται πλέον ένα "CodeInstance" αντί για έναν τύπο, κάτι που μπορεί να επιταχύνει ορισμένες ροές εργασίας πρόσθετων μεταγλωττιστών.
    • Η συνάρτηση "Timer(f, …)" κληρονομεί πλέον την κολλώδη λειτουργία της γονικής εργασίας κατά τη δημιουργία εργασιών χρονομέτρου, η οποία μπορεί να παρακαμφθεί με το νέο όρισμα "spawn". Αυτό επιλύει ένα πρόβλημα όπου οι κολλώδεις εργασίες που δημιουργήθηκαν ("@async") καθιστούσαν την γονική εργασία κολλώδη.
    • Ο "Χρονοδιακόπτης" έχει πλέον αναγνώσιμες ιδιότητες "χρονικού ορίου" και "διαστήματος", καθώς και μια πιο περιγραφική μέθοδο "εμφάνισης".
    • Η 'sort' υποστηρίζει πλέον πλειάδες 'NTuple'.
    • Το "map!(f, A)" αποθηκεύει πλέον τα αποτελέσματα σε "A", όπως "map!(f, A, A)" ή "A .= f.(A)".
    • Η συνάρτηση "setprecision" με όρισμα συνάρτησης (συνήθως μέσω μπλοκ "do") είναι πλέον ασφαλής για νήματα. Άλλες μορφές θα πρέπει να αποφεύγονται και οι τύποι θα πρέπει να μετεγκαθίστανται σε μια υλοποίηση χρησιμοποιώντας το "ScopedValue".
  • Τυπικές Αλλαγές Βιβλιοθήκης
    • Η συνάρτηση "gcdx(0, 0)" επιστρέφει τώρα "(0, 0, 0)" αντί για "(0, 1, 0)".
    • Η συνάρτηση "fd" επιστρέφει "RawFD" αντί για "Int".
    • JuliaSyntaxΠακέτο επισήμανσης
      • Ένα νέο τυποποιημένο πακέτο για την εφαρμογή επισήμανσης σύνταξης σε κώδικα Julia, χρησιμοποιώντας το JuliaSyntax και το StyledStrings για την υλοποίηση μιας συνάρτησης επισήμανσης που παράγει ένα AnnotatedString με την επισήμανση εφαρμοσμένη.
    • Πακέτο Γραμμικής Άλγεβρας.
      • Το "rank" μπορεί πλέον να δεχτεί έναν πίνακα "QRPivoted" για να εκτιμήσει την κατάταξη μέσω παραγοντοποίησης QR.
      • Προστέθηκε η παράμετρος κλειδιού "alg" στις μεταβλητές "eigen", "eigen!", "eigvals" και "eigvals!" για αυτοσυζυγείς τύπους πινάκων (τυπική ένωση "RealHermSymComplexHerm"), επιτρέποντας την εναλλαγή μεταξύ διαφορετικών αλγορίθμων εξαγωγής ιδιοτιμών.
      • Προστέθηκε μια γενική έκδοση της μη αποκλεισμένης αποσύνθεσης Cholesky με περιστροφική δειγματοληψία (που καλείται μέσω του "cholesky[!](A, RowMaximum())").
      • Ο προεπιλεγμένος αριθμός νημάτων BLAS λαμβάνει πλέον υπόψη τη συνάφεια της διεργασίας και όχι απλώς τον αριθμό των λογικών νημάτων στο σύστημα.
      • Προστέθηκε η συνάρτηση "zeroslike", η οποία επιστρέφει μηδενικά στοιχεία για πίνακες που βασίζονται σε ταινία. Οι προσαρμοσμένοι τύποι πινάκων μπορούν να εξειδικεύσουν αυτήν τη συνάρτηση ώστε να επιστρέφει το σωστό αποτέλεσμα.
      • Ο πολλαπλασιασμός πινάκων "A * B" καλεί πλέον την εντολή "matprod_dest(A, B, T::Type)" για να δημιουργήσει τον προορισμό. Αυτή η συνάρτηση είναι πλέον δημόσια.
      • Η συνάρτηση "haszero(T::Type)" χρησιμοποιείται για να ελέγξει εάν ο τύπος "T" έχει ένα μοναδικό μηδενικό στοιχείο, που ορίζεται ως "zero(T)". Είναι πλέον δημόσια.
      • Προστέθηκε η συνάρτηση "diagview", η οποία επιστρέφει μια προβολή μιας συγκεκριμένης διαγωνίου του πίνακα "AbstractMatrix".
    • Πακέτο προφίλ
      • Το "Profile.take_heap_snapshot" δέχεται πλέον μια νέα παράμετρο, "redact_data::Bool", με προεπιλογή "true". Εάν είναι ενεργοποιημένο, τα περιεχόμενα των αντικειμένων Julia (όπως οι συμβολοσειρές) δεν περιλαμβάνονται στο στιγμιότυπο σωρού.
      • Το "Profile.print()" χρωματίζει πλέον τις λειτουργικές μονάδες Base/Core/Package με τον ίδιο τρόπο όπως και στις ιχνηλατήσεις στοίβας, και οι διαδρομές (ακόμα και οι περικομμένες) είναι πλέον δυνατές με κλικ σε τερματικά που υποστηρίζουν συνδέσμους URI και επιτρέπουν το άνοιγμα του καθορισμένου αρχείου και γραμμής στον επεξεργαστή που καθορίζεται από το "JULIA_EDITOR".
    • ΑΠΑΝΤΗΣΗ
      • Χρησιμοποιώντας τη νέα δυνατότητα "usings=true" στη συνάρτηση "names()", η συμπλήρωση REPL μπορεί να ολοκληρώσει ονόματα που είναι ορατά μέσω της συνάρτησης "using".
      • Η συμπλήρωση REPL μπορεί πλέον να ολοκληρώνει συμβολοσειρές όπως "[import|using] Mod: xxx|", για παράδειγμα, συμπληρώνοντας "using Base.Experimental: @op" σε "using Base.Experimental: @opaque".
      • Το REPL εκδίδει πλέον μια προειδοποίηση εάν ένα όνομα αναφέρεται μέσω μιας ενότητας που δεν το ορίζει (και δεν έχει υποενότητα που το ορίζει) και το όνομα δεν είναι δημόσιο σε αυτήν την ενότητα. Για παράδειγμα, το "map" ορίζεται στο Base και η εκτέλεση του "LinearAlgebra.map" στο REPL θα εκδίδει πλέον μια προειδοποίηση την πρώτη φορά που γίνεται μια τέτοια αναφορά.
      • Κατά την έξοδο εισόδου στο REPL, η έξοδος πλέον περιορίζεται στα 20 KiB. Αυτό δεν επηρεάζει τις χειροκίνητες κλήσεις για "εμφάνιση", "εκτύπωση" κ.λπ.
      • Η αυτόματη συμπλήρωση για τον χαρακτήρα "\" εμφανίζει πλέον τον αντίστοιχο χαρακτήρα ή emoji δίπλα σε κάθε αντίστοιχη κωδική λέξη.
    • Πακέτο δοκιμής
      • Εάν η σουίτα δοκιμών DefaultTestSet αποτύχει, η γεννήτρια τυχαίων αριθμών (RNG) της σουίτας δοκιμών εκτυπώνεται για να βοηθήσει στην αναπαραγωγή ενός στοχαστικού σφάλματος που εξαρτάται μόνο από την κατάσταση RNG. Μπορείτε επίσης να καθορίσετε το RNG για μια σουίτα δοκιμών μεταβιβάζοντας την παράμετρο rng στη μακροεντολή @testset: julia using Test, Random @testset rng=Xoshiro(0x2e026445595ed28e, 0x07bb81ac4c54926d, 0x83d7d70843e8bad6, 0xdbef927d150af80b, 0xdbf91ddf2534f850) begin @test rand() == 0.559472630416976 end
    • Πακέτο InteractiveUtils
      • Νέες μακροεντολές "@trace_compile" και "@trace_dispatch" για την εκτέλεση εκφράσεων με τις παραμέτρους "--trace-compile=stderr --trace-compile-timing" και "--trace-dispatch=stderr" αντίστοιχα.
  • Εξωτερικές εξαρτήσεις
    • Η βάση δεδομένων πληροφοριών τερματικού ("terminfo") περιλαμβάνεται πλέον από προεπιλογή στο Julia, βελτιώνοντας την απόδοση του REPL όταν το terminfo δεν είναι διαθέσιμο στο σύστημα. Το Julia μπορεί να δημιουργηθεί χωρίς να συμπεριληφθεί η βάση δεδομένων χρησιμοποιώντας την παράμετρο Makefile "WITH_TERMINFO=0".
  • Βελτιώσεις εργαλείων
    • Ένα εργαλείο δημιουργίας προφίλ σε χρόνο τοίχου είναι διαθέσιμο για χρήστες που χρειάζονται ένα εργαλείο δημιουργίας προφίλ δειγματοληψίας που καταγράφει εργασίες ανεξάρτητα από την κατάστασή τους (προγραμματισμένη/εκτελούμενη). Αυτό το εργαλείο δημιουργίας προφίλ επιτρέπει τη δημιουργία προφίλ για εργασίες με μεγάλη ζήτηση εισόδου/εξόδου και βοηθά στον εντοπισμό περιοχών με έντονη διαφωνία στο σύστημα.

Πηγή: opennet.ru

Αγοράστε αξιόπιστη φιλοξενία για ιστότοπους με προστασία DDoS, διακομιστές VPS VDS 🔥 Αγοράστε αξιόπιστη φιλοξενία ιστοσελίδων με προστασία DDoS, διακομιστές VPS VDS | ProHoster