کدام زبان سریع‌تر است؟ سی شارپ یا پایتون

در این مقاله، هدف ما بررسی و مقایسه بنچ‌مارک اجرای کدهای ساده در زبان‌های Python و C# است. برای این منظور، پنج نوع تست مختلف بر روی هر دو زبان انجام خواهی......

انتشار: , زمان مطالعه: 16 دقیقه
کدام زبان سریع‌تر است؟ سی شارپ یا پایتون
دسته بندی: نبرد فناوری‌ها تعداد بازدید: 77

مقایسه عملکرد زبان‌های برنامه‌نویسی برای سنجش سرعت و مصرف منابع در شرایط مختلف از اهمیت بالایی برخوردار است. در این مقاله، هدف ما بررسی و مقایسه بنچ‌مارک اجرای کدهای ساده در زبان‌های Python و C# است. برای این منظور، پنج نوع تست مختلف بر روی هر دو زبان انجام خواهیم داد و در پایان هر تست، میزان منابع مصرف شده شامل زمان اجرا و مصرف حافظه را محاسبه خواهیم کرد.

معیارهای سنجش

بنچ‌مارک در هر تست بر اساس معیارهای زیر انجام می‌شود:

  1. زمان شروع و پایان اجرای هر کد: برای محاسبه سرعت اجرای هر تست.
  2. میزان حافظه مصرفی: برای اندازه‌گیری میزان حافظه مورد نیاز برای اجرای هر کد.
  3. استفاده از CPU: برای مشاهده میزان استفاده از CPU در طول اجرای کد.

تست‌ها

در این مقاله، پنج نوع تست مختلف برای بنچ‌مارک کدها در نظر گرفته شده است. هر یک از این تست‌ها بر اساس یک عملیات متفاوت طراحی شده‌اند که شامل موارد زیر می‌شود: محاسبات ریاضی سنگین، عملیات ورودی/خروجی (I/O)، مدیریت رشته‌های طولانی، اجرای حلقه‌های ساده، و مرتب‌سازی لیست‌ها یا آرایه‌ها. این تست‌ها به منظور سنجش عملکرد زبان‌های Python و C# از نظر سرعت اجرا و مصرف حافظه طراحی شده‌اند و نتایج آن‌ها مقایسه‌ای جامع از این دو زبان در شرایط مختلف ارائه می‌دهد.

در این تست، از یک سرور با مشخصات زیر استفاده شده است:

  • رم (حافظه): 32 گیگابایت
  • پردازنده: Intel(R) Core(TM) i9-7980XE CPU
  • هارد دیسک: NVMe

نسخه های زبان ها:

سی شارپ تحت .NET 6

پایتون نسخه 3.12.4

کدهای Python برای بنچ‌مارک

در این بخش، کدهایی که در زبان Python برای بنچ‌مارک استفاده شده‌اند، آورده می‌شود.

import time
import psutil
import os
import random

# Programmer: Ebrahim Shafiei (EbraSha)
# Email: [email protected]

def benchmark(test_function):
    start_time = time.time()
    process = psutil.Process(os.getpid())
    start_memory = process.memory_info().rss

    test_function()

    end_time = time.time()
    end_memory = process.memory_info().rss
    execution_time = end_time - start_time
    memory_used = (end_memory - start_memory) / (1024 * 1024)

    print(f"Execution Time: {execution_time} seconds")
    print(f"Memory Used: {memory_used} MB")

# Test 1: Simple loop
def test_1():
    result = 0
    for i in range(10000000):
        result += i

# Test 2: Heavy calculation
def test_2():
    result = sum([i ** 2 for i in range(100000)])

# Test 3: File I/O
def test_3():
    with open("test_file.txt", "w") as f:
        for i in range(100000):
            f.write(f"Line {i}\n")

# Test 4: String manipulation
def test_4():
    s = "a" * 1000000
    s = s[::-1] + "b" * 1000000

# Test 5: List sorting
def test_5():
    lst = [random.randint(1, 10000) for _ in range(100000)]
    lst.sort()

# Running the tests
print("Test 1 Results:")
benchmark(test_1)

print("Test 2 Results:")
benchmark(test_2)

print("Test 3 Results:")
benchmark(test_3)

print("Test 4 Results:")
benchmark(test_4)

print("Test 5 Results:")
benchmark(test_5)

کدهای C# برای بنچ‌مارک

در ادامه کدهای مشابهی برای زبان C# آورده شده‌اند تا بتوان به مقایسه دقیق‌تری دست یافت.

using System;
using System.Diagnostics;
using System.IO;
using System.Linq;

class Program
{
    // Programmer: Ebrahim Shafiei (EbraSha)
    // Email: [email protected]

    static void Benchmark(Action testFunction)
    {
        var stopwatch = Stopwatch.StartNew();
        long startMemory = GC.GetTotalMemory(true);

        testFunction();

        stopwatch.Stop();
        long endMemory = GC.GetTotalMemory(false);
        double executionTime = stopwatch.Elapsed.TotalSeconds;
        double memoryUsed = (endMemory - startMemory) / (1024.0 * 1024.0);

        Console.WriteLine($"Execution Time: {executionTime} seconds");
        Console.WriteLine($"Memory Used: {memoryUsed} MB");
    }

    static void Test1()
    {
        long result = 0;
        for (int i = 0; i < 10000000; i++)
        {
            result += i;
        }
    }

    static void Test2()
    {
        long result = 0;
        for (int i = 0; i < 100000; i++)
        {
            result += i * i;
        }
    }

    static void Test3()
    {
        using (StreamWriter writer = new StreamWriter("test_file.txt"))
        {
            for (int i = 0; i < 100000; i++)
            {
                writer.WriteLine($"Line {i}");
            }
        }
    }

    static void Test4()
    {
        string s = new string('a', 1000000);
        s = new string(s.Reverse().ToArray()) + new string('b', 1000000);
    }

    static void Test5()
    {
        Random rand = new Random();
        int[] array = Enumerable.Range(1, 100000).Select(_ => rand.Next(1, 10000)).ToArray();
        Array.Sort(array);
    }

    static void Main(string[] args)
    {
        Console.WriteLine("Test 1 Results:");
        Benchmark(Test1);

        Console.WriteLine("Test 2 Results:");
        Benchmark(Test2);

        Console.WriteLine("Test 3 Results:");
        Benchmark(Test3);

        Console.WriteLine("Test 4 Results:");
        Benchmark(Test4);

        Console.WriteLine("Test 5 Results:");
        Benchmark(Test5);
    }
}

تحلیل نتایج نهایی بنچ‌مارک Python و C#

تحلیل نتایج نهایی بنچ‌مارک Python و C#

تحلیل نتایج نهایی بنچ‌مارک Python و C#

 

در این بخش به تحلیل دقیق نتایج جدیدی که از پنج تست برای زبان‌های Python و C# به دست آمده است، می‌پردازیم. این نتایج برای درک بهتر تفاوت‌های عملکردی بین این دو زبان در شرایط مختلف ارائه شده است.

Test 1: محاسبات ساده با حلقه

  • Python: زمان اجرا: 0.459 ثانیه، حافظه مصرفی: 0 MB
  • C#: زمان اجرا: 0.0060887 ثانیه، حافظه مصرفی: 0 MB

در این تست،  C# به مراتب سریع‌تر از Python عمل کرده است. زبان C# به دلیل بهینه‌سازی‌های سطح پایین و کامپایل به کد ماشین در این نوع محاسبات ساده با حلقه‌ها عملکرد بسیار بهتری از خود نشان داده است.

Test 2: محاسبات سنگین

  • Python: زمان اجرا: 0.0105 ثانیه، حافظه مصرفی: 1.296 MB
  • C#: زمان اجرا: 0.0003389 ثانیه، حافظه مصرفی: 0 MB

در این تست نیز C# به طور چشمگیری سریع‌تر عمل کرده و مصرف حافظه آن نیز نزدیک به صفر بوده است. این نشان می‌دهد که C# در انجام محاسبات پیچیده و سنگین نیز به خوبی بهینه شده است. در مقابل، Python در محاسبات سنگین مصرف حافظه بیشتری دارد.

Test 3: عملیات ورودی/خروجی

  • Python: زمان اجرا: 0.073 ثانیه، حافظه مصرفی: 0.046 MB
  • C#: زمان اجرا: 0.0165 ثانیه، حافظه مصرفی: 4.539 MB

در این تست، Python نسبت به C# زمان بیشتری برای عملیات I/O صرف کرده، اما مصرف حافظه آن بسیار کمتر بوده است. C# با وجود عملکرد سریع‌تر، مصرف حافظه بیشتری در این عملیات داشته که نشان‌دهنده مدیریت متفاوت حافظه در این زبان است.

Test 4: مدیریت رشته‌های طولانی

  • Python: زمان اجرا: 0.004 ثانیه، حافظه مصرفی: -0.046 MB
  • C#: زمان اجرا: 0.0214 ثانیه، حافظه مصرفی: 13.45 MB

در عملیات مدیریت رشته‌های طولانی، Python با مصرف کم حافظه و زمان بسیار کوتاه، عملکرد بهتری نسبت به C# داشته است. این تست نشان می‌دهد که Python در کار با رشته‌ها بهینه‌تر عمل می‌کند، در حالی که C# حافظه بیشتری را برای مدیریت رشته‌های طولانی مصرف کرده است.

Test 5: عملیات مرتب‌سازی لیست‌ها

  • Python: زمان اجرا: 0.069 ثانیه، حافظه مصرفی: -0.0078 MB
  • C#: زمان اجرا: 0.0117 ثانیه، حافظه مصرفی: 0.397 MB

در این تست نیز C# از نظر زمان اجرا بسیار سریع‌تر عمل کرده، اما مصرف حافظه آن نسبت به Python بیشتر بوده است. Python در این تست مصرف حافظه ناچیزی دارد و نشان می‌دهد که این زبان بهینه‌سازی‌های خوبی برای مرتب‌سازی لیست‌ها انجام می‌دهد.

نتیجه‌گیری نهایی

از نتایج به دست آمده می‌توان به این نکات کلیدی دست یافت:

  • C# در تمام تست‌ها از نظر زمان اجرا عملکرد بهتری از خود نشان داده است و برای عملیات‌هایی که نیاز به سرعت بالا دارند مناسب‌تر است.
  • Python به طور کلی مصرف حافظه کمتری داشته و برای عملیات‌هایی که بهینه‌سازی حافظه اهمیت دارد، می‌تواند مناسب‌تر باشد.
  • در مدیریت رشته‌های طولانی و عملیات‌های مبتنی بر I/O، Python عملکرد بهتری از نظر مصرف حافظه ارائه کرده است.
  • در محاسبات سنگین و مرتب‌سازی لیست‌ها، C# زمان اجرای کمتری داشته ولی حافظه بیشتری مصرف کرده است.

این مقایسه نشان می‌دهد که انتخاب زبان برنامه‌نویسی به شدت به نیازهای پروژه بستگی دارد. اگر سرعت و کارایی بالا مهم‌تر است، C# انتخاب بهتری است، در حالی که اگر حافظه و مدیریت منابع اهمیت بیشتری داشته باشد، Python ممکن است گزینه مناسب‌تری باشد.

تست ها را 50 برابر قوی تر می کنیم !!!

برای انجام یک بنچ‌مارک قوی‌تر و بررسی بهتر عملکرد زبان‌های Python و C#، تست‌های موجود را 50 برابر افزایش دادیم. این افزایش به معنی بیشتر کردن تعداد تکرارها و حجم داده‌هایی است که در هر تست استفاده می‌شوند. هدف از این افزایش، شبیه‌سازی سناریوهایی با بار محاسباتی و مصرف منابع بیشتر است تا بتوان کارایی هر زبان را در شرایط سنگین‌تر نیز بررسی کرد.

تغییرات انجام‌شده در تست‌ها:

  1. Test 1 (حلقه ساده): تعداد تکرارها از 10 میلیون به 500 میلیون افزایش یافته است.
  2. Test 2 (محاسبات سنگین): تعداد محاسبات از 100 هزار به 5 میلیون افزایش یافته است.
  3. Test 3 (ورودی/خروجی فایل): تعداد خطوط نوشته‌شده در فایل از 100 هزار به 5 میلیون خط افزایش یافته است.
  4. Test 4 (مدیریت رشته‌های طولانی): طول رشته‌ها به 50 میلیون کاراکتر افزایش یافته است.
  5. Test 5 (مرتب‌سازی لیست‌ها): اندازه لیست از 100 هزار به 5 میلیون عنصر افزایش یافته است.

کدهای C# با افزایش قدرت 50 برابر

using System;
using System.Diagnostics;
using System.IO;
using System.Linq;

class Program
{
    // Programmer: Ebrahim Shafiei (EbraSha)
    // Email: [email protected]

    static void Benchmark(Action testFunction)
    {
        var stopwatch = Stopwatch.StartNew();
        long startMemory = GC.GetTotalMemory(true);

        testFunction();

        stopwatch.Stop();
        long endMemory = GC.GetTotalMemory(false);
        double executionTime = stopwatch.Elapsed.TotalSeconds;
        double memoryUsed = (endMemory - startMemory) / (1024.0 * 1024.0);

        Console.WriteLine($"Execution Time: {executionTime} seconds");
        Console.WriteLine($"Memory Used: {memoryUsed} MB");
    }

    static void Test1()
    {
        long result = 0;
        for (int i = 0; i < 500000000; i++) // 50 times stronger
        {
            result += i;
        }
    }

    static void Test2()
    {
        long result = 0;
        for (int i = 0; i < 5000000; i++) // 50 times stronger
        {
            result += i * i;
        }
    }

    static void Test3()
    {
        using (StreamWriter writer = new StreamWriter("test_file.txt"))
        {
            for (int i = 0; i < 5000000; i++) // 50 times stronger
            {
                writer.WriteLine($"Line {i}");
            }
        }
    }

    static void Test4()
    {
        string s = new string('a', 50000000); // 50 times stronger
        s = new string(s.Reverse().ToArray()) + new string('b', 50000000); // 50 times stronger
    }

    static void Test5()
    {
        Random rand = new Random();
        int[] array = Enumerable.Range(1, 5000000).Select(_ => rand.Next(1, 10000)).ToArray(); // 50 times stronger
        Array.Sort(array);
    }

    static void Main(string[] args)
    {
        Console.WriteLine("Test 1 Results:");
        Benchmark(Test1);

        Console.WriteLine("Test 2 Results:");
        Benchmark(Test2);

        Console.WriteLine("Test 3 Results:");
        Benchmark(Test3);

        Console.WriteLine("Test 4 Results:");
        Benchmark(Test4);

        Console.WriteLine("Test 5 Results:");
        Benchmark(Test5);
        Console.ReadLine();
    }
}

کدهای Python با افزایش قدرت 50 برابر

import time
import psutil
import os
import random

# Programmer: Ebrahim Shafiei (EbraSha)
# Email: [email protected]

def benchmark(test_function):
    start_time = time.time()
    process = psutil.Process(os.getpid())
    start_memory = process.memory_info().rss

    test_function()

    end_time = time.time()
    end_memory = process.memory_info().rss
    execution_time = end_time - start_time
    memory_used = (end_memory - start_memory) / (1024 * 1024)

    print(f"Execution Time: {execution_time} seconds")
    print(f"Memory Used: {memory_used} MB")

# Test 1: Simple loop
def test_1():
    result = 0
    for i in range(500000000):  # 50 times stronger
        result += i

# Test 2: Heavy calculation
def test_2():
    result = sum([i ** 2 for i in range(5000000)])  # 50 times stronger

# Test 3: File I/O
def test_3():
    with open("test_file.txt", "w") as f:
        for i in range(5000000):  # 50 times stronger
            f.write(f"Line {i}\n")

# Test 4: String manipulation
def test_4():
    s = "a" * 50000000  # 50 times stronger
    s = s[::-1] + "b" * 50000000  # 50 times stronger

# Test 5: List sorting
def test_5():
    lst = [random.randint(1, 10000) for _ in range(5000000)]  # 50 times stronger
    lst.sort()

# Running the tests
print("Test 1 Results:")
benchmark(test_1)

print("Test 2 Results:")
benchmark(test_2)

print("Test 3 Results:")
benchmark(test_3)

print("Test 4 Results:")
benchmark(test_4)

print("Test 5 Results:")
benchmark(test_5)

تحلیل نتایج تست‌های 50 برابر قوی‌تر در Python و C#

تحلیل نتایج تست‌های 50 برابر قوی‌تر در Python و C#

پس از تقویت تست‌ها به اندازه 50 برابر، نتایج به دست آمده نشان‌دهنده تفاوت‌های عملکردی چشم‌گیری بین زبان‌های Python و C# است. در ادامه به تحلیل دقیق‌تر این نتایج می‌پردازیم.

Test 1: حلقه ساده

  • Python: زمان اجرا: 22.05 ثانیه، حافظه مصرفی: 0.0078 MB
  • C#: زمان اجرا: 0.2437 ثانیه، حافظه مصرفی: 0 MB

در این تست، C# بسیار سریع‌تر از Python عمل کرده است، به طوری که زمان اجرای C# حدود 90 برابر سریع‌تر از Python است. این تفاوت در اجرای حلقه‌های ساده به بهینه‌سازی‌های قوی‌تر C# در سطح پایین بازمی‌گردد.

Test 2: محاسبات سنگین

  • Python: زمان اجرا: 0.65 ثانیه، حافظه مصرفی: 2.22 MB
  • C#: زمان اجرا: 0.0042 ثانیه، حافظه مصرفی: 0.0078 MB

در محاسبات سنگین، C# عملکرد بسیار بهتری دارد و با سرعتی حدود 150 برابر سریع‌تر از Python عمل کرده است. همچنین C# حافظه کمتری مصرف کرده و این نشان می‌دهد که این زبان در انجام محاسبات پیچیده بسیار بهینه است.

Test 3: عملیات ورودی/خروجی (I/O)

  • Python: زمان اجرا: 3.47 ثانیه، حافظه مصرفی: -0.80 MB
  • C#: زمان اجرا: 0.46 ثانیه، حافظه مصرفی: 6.80 MB

در عملیات I/O، C# همچنان سریع‌تر از Python عمل کرده است. با این حال، C# در مقایسه با Python مقدار قابل توجهی حافظه بیشتر مصرف کرده است. این نشان می‌دهد که Python در مدیریت حافظه در عملیات‌های فایل عملکرد بهتری دارد.

Test 4: مدیریت رشته‌های طولانی

  • Python: زمان اجرا: 0.088 ثانیه، حافظه مصرفی: 0 MB
  • C#: زمان اجرا: 0.49 ثانیه، حافظه مصرفی: 476.84 MB

در عملیات مربوط به رشته‌های طولانی، Python از لحاظ سرعت و مصرف حافظه عملکرد بهتری داشته است. مصرف حافظه C# بسیار بالا بوده (476 MB)، که نشان می‌دهد این زبان در مدیریت رشته‌های بسیار طولانی به اندازه Python بهینه نیست.

Test 5: مرتب‌سازی لیست‌ها

  • Python: زمان اجرا: 4.07 ثانیه، حافظه مصرفی: -0.89 MB
  • C#: زمان اجرا: 0.40 ثانیه، حافظه مصرفی: 19.09 MB

در عملیات مرتب‌سازی لیست‌ها، C# با سرعتی حدود 10 برابر سریع‌تر از Python عمل کرده است، اما مصرف حافظه C# به طور چشمگیری بیشتر بوده است. Python در مدیریت حافظه در این عملیات کارآمدتر است.

نتیجه‌گیری نهایی

از نتایج به دست آمده در تست‌های 50 برابر قوی‌تر، چند نتیجه مهم استخراج می‌شود:

  1. C# به طور کلی سرعت بسیار بیشتری نسبت به Python در تمام تست‌ها دارد، به خصوص در تست‌های محاسبات سنگین و مرتب‌سازی لیست‌ها.
  2. Python در مدیریت حافظه به طور قابل ملاحظه‌ای بهینه‌تر عمل کرده و در برخی موارد مانند عملیات ورودی/خروجی و مدیریت رشته‌های طولانی، مصرف حافظه کمتری دارد.
  3. در تست‌های سنگین، C# به دلیل بهینه‌سازی‌های سطح پایین برای پردازش سریع‌تر مناسب‌تر است، در حالی که Python برای مدیریت بهینه‌تر حافظه در عملیات پیچیده گزینه مناسبی است.

انتخاب بین Python و C# همچنان به نوع پروژه و نیازمندی‌های خاص آن بستگی دارد. اگر سرعت اجرا در اولویت است، C# انتخاب بهتری است، اما اگر مصرف حافظه و بهینه‌سازی حافظه مدنظر باشد، Python می‌تواند گزینه مناسبی باشد.


دیدگاه های مربوط به این مقاله (برای ارسال دیدگاه در سایت حتما باید عضو باشید و پروفایل کاربری شما تکمیل شده باشد)

تعداد 1 دیدگاه ثبت شده
دکترهادی رنجبر می گه: زمان ثبت: 2 هفته پیش

❤️🥰🌺