.NET 8, вызывая перегрузку ЦП при использовании readerWriterlockslim [закрыто]C#

Место общения программистов C#
Ответить
Anonymous
 .NET 8, вызывая перегрузку ЦП при использовании readerWriterlockslim [закрыто]

Сообщение Anonymous »

I переводил проект с .net 6 на .net 8 и столкнулся с проблемой с производительностью процессора при использовании readerwriterlockslim . С .net 8 потребление процессора намного выше (в 4-5x выше), чем .net 6. Я использовал ниже образца кода для проверки производительности ЦП: < /p>
Пример кода, используемый для тестирования был сгенерирован с использованием CHATGPT: < /p>
public class ReaderWriterSlimTests
{
private static readonly ReaderWriterLockSlim _lock = new ReaderWriterLockSlim();

private static int _sharedResource = 0;
private static readonly int ReaderCount = Environment.ProcessorCount * 2;
private static readonly int WriterCount = Environment.ProcessorCount / 2;
private static readonly int Iterations = 1_000_000;
private static volatile bool _running = true;

public void RunTests()
{
Console.WriteLine($"Running test on .NET {Environment.Version}");
Console.WriteLine($"Readers: {ReaderCount}, Writers: {WriterCount}, Iterations: {Iterations}");

Stopwatch stopwatch = Stopwatch.StartNew();
Process process = Process.GetCurrentProcess();
TimeSpan startCpuTime = process.TotalProcessorTime;

Thread[] readers = new Thread[ReaderCount];
Thread[] writers = new Thread[WriterCount];

// Start readers
for (int i = 0; i < ReaderCount; i++)
{
readers = new Thread(ReaderTask);
readers.Start();
}

// Start writers
for (int i = 0; i < WriterCount; i++)
{
writers = new Thread(WriterTask);
writers.Start();
}

// Run for a few seconds
Thread.Sleep(30000);
_running = false;

// Wait for all threads to finish
foreach (var reader in readers) reader.Join();
foreach (var writer in writers) writer.Join();

stopwatch.Stop();
TimeSpan endCpuTime = process.TotalProcessorTime;
double cpuUsage = (endCpuTime - startCpuTime).TotalMilliseconds / stopwatch.ElapsedMilliseconds * 100;

Console.WriteLine($"Elapsed Time: {stopwatch.ElapsedMilliseconds} ms");
Console.WriteLine($"CPU Usage Approximation: {cpuUsage:F2}%");
}

private void ReaderTask()
{
while (_running)
{
_lock.EnterReadLock();
var value = _sharedResource; // Simulate read
_lock.ExitReadLock();
}
}

private void WriterTask()
{
Random rnd = new Random();
while (_running)
{
_lock.EnterWriteLock();
_sharedResource = rnd.Next(); // Simulate write
_lock.ExitWriteLock();
}
}
}
< /code>
Если я запускаю этот код в .net 6, использование процессора составляет около 300%. Тот же код в .NET 8 составляет около 1800%. Кроме того, в будущем, как исправить эту проблему в .net 8? < /P>
Спасибо
vik < /p>

Подробнее здесь: https://stackoverflow.com/questions/793 ... erlockslim
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»