Jak ustawić maksymalną liczbę wątków równoległych
Podczas odczytywania dużej ilości kodów kreskowych poleganie na procesie jednówątkowym może tworzyć wąskie gardła wydajności i ograniczać skalowalność. Jednakże użycie wątków równoległych pozwala aplikacji przetwarzać wiele obrazów jednocześnie, efektywnie zwiększając całkowitą moc przetwarzania i znacznie skracając czas potrzebny na zakończenie zadania przetwarzania partii.
Ustawienie maksymalnego limitu dla tych wątków jest potężnym sposobem na optymalizację wydajności. Zapewnia to, że aplikacja wykorzystuje pełny potencjał sprzętu poprzez zrównoważenie obciążenia między rdzeniami procesora. To podejście maksymalizuje wydajność, utrzymując aplikację w płynnym działaniu, jednocześnie dostarczając najszybsze możliwe wyniki.
IronBarcode zapewnia prosty sposób na kontrolę tego limitu, gwarantując osiągnięcie optymalnej wydajności maszyny. Poniższa sekcja demonstruje, jak łatwo ustalić te limity wątków.
Jak ustawić max. równoległe wątki w C#
- Pobierz bibliotekę IronBarcode C# do ustawienia maksymalnej liczby wątków równoległych dla odczytu kodu kreskowego
- Załaduj kody kreskowe z określonego folderu
- Utwórz nowy obiekt
BarcodeReaderOptions - Ustaw
Multithreadedna true i podaj wartość całkowitą dlaMaxParallelThreads - Wydrukuj i wyświetl wyniki za pomocą
BarcodeResults
Ustaw maksymalną liczbę wątków równoległych
W tym przykładzie użyjemy dużego zestawu obrazów kodów kreskowych, aby zilustrować skalowalność i wydajność używania procesu wielowątkowego zamiast jednówątkowego. Folder obrazów można pobrać tutaj.
Aby skonfigurować IronBarcode do używania więcej niż jednego wątku, najpierw instancjonowany jest nowy obiekt BarcodeReaderOptions z ustwionym Multithreaded na true. Następnie ustawiana jest właściwość MaxParallelThreads poprzez przypisanie jej wartości całkowitej. Domyślnie MaxParallelThreads ustawione jest na 4.
Po skonfigurowaniu ustawień, z folderu importowana jest duża liczba obrazów kodów kreskowych. Następnie, za pomocą pętli, katalog obrazów z kodami kreskowymi jest odczytywany za pomocą metody Read, przekazując ścieżkę do pliku i skonfigurowany BarcodeReaderOptions. Na koniec, wartość i typ kodu kreskowego są wyświetlane poprzez dostęp do BarcodeResults.
:path=/static-assets/barcode/content-code-examples/how-to/set-max-parallel-thread.cs
using Google.Protobuf.WellKnownTypes;
using IronBarCode;
using System;
using System.IO;
int maxParallelThreads = 4;
var optionsFaster = new BarcodeReaderOptions
{
// Set Max threads to 4
Multithreaded = true,
MaxParallelThreads = maxParallelThreads,
};
// Dynamically get the "images" folder in the current directory
string folderPath = Path.Combine(Directory.GetCurrentDirectory(), "images");
// Retrieve all JPG files in the directory
var pdfFiles = Directory.GetFiles(folderPath, "*.jpg");
foreach (var file in pdfFiles)
{
// Read the barcode
var results = BarcodeReader.Read(file);
foreach (var result in results)
{
// Show the type and value for every barcode found
Console.WriteLine($"Value: {result.Value}, Type: {result.BarcodeType}");
}
}
Imports Google.Protobuf.WellKnownTypes
Imports IronBarCode
Imports System
Imports System.IO
Dim maxParallelThreads As Integer = 4
Dim optionsFaster As New BarcodeReaderOptions With {
.Multithreaded = True,
.MaxParallelThreads = maxParallelThreads
}
' Dynamically get the "images" folder in the current directory
Dim folderPath As String = Path.Combine(Directory.GetCurrentDirectory(), "images")
' Retrieve all JPG files in the directory
Dim pdfFiles = Directory.GetFiles(folderPath, "*.jpg")
For Each file In pdfFiles
' Read the barcode
Dim results = BarcodeReader.Read(file)
For Each result In results
' Show the type and value for every barcode found
Console.WriteLine($"Value: {result.Value}, Type: {result.BarcodeType}")
Next
Next
Wynik
Jak widać na wyjściu konsoli, wyświetla ona wartość i typ BARCODE dla każdego odpowiadającego mu obrazu.
Ustawianie odpowiedniej maksymalnej liczby wątków równoległych
Gdy właściwość Multithreaded jest ustawiona na true, właściwość MaxParallelThreads domyślnie wynosi 4. Chociaż nie ma ścisłego limitu liczby całkowitej przypisanej do MaxParallelThreads, ustawienie wartości wyższej niż pojemność logicznych rdzeni sprzętu może faktycznie prowadzić do spadku wydajności. Wynika to z faktu, że procesor nie jest w stanie obsłużyć nadmiernej zmiany kontekstu, co może skutkować obciążeniem zamiast przyspieszeniem. Dlatego poprawna wartość dlaMaxParallelThreadszależy od specyfikacji komputera, a programiści powinni testować, aby znaleźć optymalną wartość dla swojego środowiska.
W tym przykładzie pokażemy ten sam scenariusz wielowątkowy co powyżej, ale z zegarem do porównania domyślnej wartości 4 z użyciem Environment.ProcessorCount do wykorzystania wszystkich dostępnych wątków. W naszym przypadku używamy komputera z 32 procesorami logicznymi, więc MaxParallelThreads zostanie ustawiony na 32.
:path=/static-assets/barcode/content-code-examples/how-to/set-max-parallel-thread-performance.cs
using IronBarCode;
using System;
using System.Diagnostics;
using System.IO;
using System.Linq;
// Set the max parallel threads to the number of processor cores
int maxParallelThreads = Environment.ProcessorCount;
var optionsFaster = new BarcodeReaderOptions
{
// Set Max threads to the number of processor cores
Multithreaded = true,
MaxParallelThreads = maxParallelThreads,
ExpectMultipleBarcodes = true,
};
// Start timing the process
var stopwatch = Stopwatch.StartNew();
// Dynamically get the "images" folder in the current directory
string folderPath = Path.Combine(Directory.GetCurrentDirectory(), "images");
// Check if directory exists to prevent crashes
if (!Directory.Exists(folderPath))
{
Console.WriteLine($"Error: The directory '{folderPath}' does not exist.");
return;
}
// Get all JPG files in the directory
var pdfFiles = Directory.GetFiles(folderPath, "*.jpg");
foreach (var file in pdfFiles)
{
// Read the barcode
var results = BarcodeReader.Read(file);
if (results.Any())
{
Console.WriteLine($"Barcode(s) found in: {Path.GetFileName(file)}");
foreach (var result in results)
{
Console.WriteLine($" Value: {result.Value}, Type: {result.BarcodeType}");
}
}
}
stopwatch.Stop();
// Print number of images the barcode reader could decode
Console.WriteLine($" Max parallel threads of {maxParallelThreads} with {stopwatch.Elapsed.TotalSeconds:F2}s");
Imports IronBarCode
Imports System
Imports System.Diagnostics
Imports System.IO
Imports System.Linq
' Set the max parallel threads to the number of processor cores
Dim maxParallelThreads As Integer = Environment.ProcessorCount
Dim optionsFaster As New BarcodeReaderOptions With {
.Multithreaded = True,
.MaxParallelThreads = maxParallelThreads,
.ExpectMultipleBarcodes = True
}
' Start timing the process
Dim stopwatch As Stopwatch = Stopwatch.StartNew()
' Dynamically get the "images" folder in the current directory
Dim folderPath As String = Path.Combine(Directory.GetCurrentDirectory(), "images")
' Check if directory exists to prevent crashes
If Not Directory.Exists(folderPath) Then
Console.WriteLine($"Error: The directory '{folderPath}' does not exist.")
Return
End If
' Get all JPG files in the directory
Dim pdfFiles As String() = Directory.GetFiles(folderPath, "*.jpg")
For Each file As String In pdfFiles
' Read the barcode
Dim results = BarcodeReader.Read(file)
If results.Any() Then
Console.WriteLine($"Barcode(s) found in: {Path.GetFileName(file)}")
For Each result In results
Console.WriteLine($" Value: {result.Value}, Type: {result.BarcodeType}")
Next
End If
Next
stopwatch.Stop()
' Print number of images the barcode reader could decode
Console.WriteLine($" Max parallel threads of {maxParallelThreads} with {stopwatch.Elapsed.TotalSeconds:F2}s")
Wynik
Czas przetwarzania przy 4 wątkach
Czas przetwarzania tego procesu wynosi 84 sekundy.
Czas przetwarzania z liczbą procesorów w środowisku
Jak widać, czas przetwarzania tej operacji wynosi 53 sekundy, co jest znacznie szybsze niż w przypadku uruchomienia jej przy użyciu tylko czterech wątków. Należy jednak pamiętać, że użycie większej liczby wątków nie gwarantuje poprawy wydajności, ponieważ zależy to od procesora hosta. Ogólną zasadą jest użycie maksymalnej liczby dostępnych procesorów minus jeden, co zapewnia, że nadal dostępny jest jeden wątek dla innych operacji systemowych.
Multithreaded na true i zwiększenie MaxParallelThreads nie poprawi szybkości procesu, a może faktycznie ją zmniejszyć.
Często Zadawane Pytania
Jaki jest cel ustawienia maksymalnej liczby wątków równoległych w IronBarcode?
Ustawienie maksymalnej liczby wątków równoległych pozwala zoptymalizować wydajność generowania kodów kreskowych poprzez efektywne wykorzystanie zasobów systemówych, zwłaszcza podczas przetwarzania dużej liczby kodów kreskowych zbiorczo.
Jak skonfigurować maksymalną liczbę wątków równoległych w IronBarcode?
Możesz skonfigurować maksymalną liczbę wątków równoległych w IronBarcode, używając odpowiedniej metody w kodzie C#, aby ustawić żądaną liczbę wątków dla zadań generowania kodów kreskowych.
Dłączego optymalizacja wydajności podczas masowego tworzenia kodów kreskowych jest tak ważna?
Optymalizacja wydajności tworzenia BarCodes w dużych ilościach zapewnia, że proces ten jest wydajny i szybki, co zmniejsza czas i zasoby potrzebne do wygenerowania dużej liczby BarCodes, co jest kluczowe dla aplikacji wymagających dużej przepustowości.
Jakie są zalety korzystania z przetwarzania równoległego w IronBarcode?
Przetwarzanie równoległe w IronBarcode pozwala na szybsze generowanie kodów kreskowych dzięki wykorzystaniu wielu rdzeni procesora, co prowadzi do poprawy wydajności aplikacji i skrócenia czasu przetwarzania przy zadaniach związanych z kodami kreskowymi na dużą skalę.
Czy ustawienie zbyt wielu równoległych wątków może negatywnie wpłynąć na wydajność?
Tak, ustawienie zbyt wielu równoległych wątków może prowadzić do rywalizacji o zasoby i zwiększonego obciążenia, potencjalnie obniżając wydajność. Ważne jest, aby znaleźć zrównoważoną konfigurację, która odpowiada możliwościom systemu.
Jakie czynniki należy wziąć pod uwagę przy wyborze liczby równoległych wątków?
Należy wziąć pod uwagę liczbę dostępnych rdzeni procesora, obciążenie systemu oraz charakter zadań związanych z generowaniem kodów BarCode. Najlepiej wypróbować różne ustawienia, aby znaleźć optymalną konfigurację.
Czy w IronBarcode istnieje domyślne ustawienie dla wątków równoległych?
IronBarcode może mieć domyślne ustawienie dotyczące wątków równoległych, ale zaleca się dostosowanie tego ustawienia w oparciu o konkretne potrzeby aplikacji, aby osiągnąć najlepszą wydajność.
W jaki sposób IronBarcode zarządza wątkami?
IronBarcode wykorzystuje możliwości wielowątkowości platformy .NET do zarządzania przetwarzaniem równoległym, umożliwiając programistom określenie liczby wątków w celu skutecznej optymalizacji wydajności.
Czy mogę dynamicznie zmieniać liczbę równoległych wątków podczas wykonywania?
Dynamiczna zmiana liczby równoległych wątków podczas wykonywania może nie być zalecana, ponieważ może prowadzić do niespójności i wpływać na stabilność działania. Najlepiej jest ustawić konfigurację przed rozpoczęciem procesu generowania BarCode’ów.
Jakie są typowe przypadki użycia ustawiania maksymalnej liczby wątków równoległych podczas generowania BarCode’ów?
Typowe zastosowania obejmują aplikacje wymagające szybkiego generowania kodów kreskowych, takie jak systemy zarządzania zapasami, systemy kasowe w handlu detalicznym oraz aplikacje logistyczne, w których szybkie przetwarzanie dużych ilości kodów kreskowych ma kluczowe znaczenie.

