کارایی و بهینه‌سازی در جولیا

Type stability، @time، @code_warntype و نکات طلایی سرعت در جولیا

چرا جولیا سریع است؟

جولیا کد شما را برای انواع مشخص کامپایل می‌کند. اگر نوع‌ها واضح باشند، کد ماشین بهینه تولید می‌شود!

Type Stability — مهم‌ترین مفهوم!

تابع «type-stable» یعنی همیشه همان نوع را برمی‌گرداند:

-- ✅ type stable — همیشه Float64
function stable(x::Float64)
    return x * 2
end

-- ❌ ناپایدار — گاهی Int گاهی Float!
function unstable(x)
    if x > 0
        return x       -- Int
    else
        return 0.0     -- Float64!
    end
end
تابع ناپایدار = کامپایلر گیج = کد کند! همیشه مطمئن شوید خروجی نوع ثابتی دارد.

@time — اندازه‌گیری

function slowSum(n)
    total = 0
    for i in 1:n
        total += i
    end
    return total
end

@time slowSum(1000000)
-- 0.000001 seconds (بار اول: شامل کامپایل)
@time slowSum(1000000)
-- 0.000001 seconds (کامپایل‌شده — سریع!)
همیشه @time را دو بار اجرا کنید! بار اول شامل زمان کامپایل JIT است.

@code_warntype — یافتن ناپایداری

function unstable(x)
    if x > 0
        return x
    else
        return 0.0
    end
end

@code_warntype unstable(5)
-- خروجی زرد/قرمز = ناپایداری!

نکات طلایی سرعت

۱. نوع مشخص برای آرگومان‌ها

-- بهتر:
function f(x::Float64)
    return x * 2
end

-- یا حداقل نوع انتزاعی:
function g(x::Number)
    return x * 2
end

۲. از متغیرهای سراسری پرهیز کنید

-- ❌ کند: متغیر سراسری
global counter = 0
function bad()
    for i in 1:10^6
        global counter += 1
    end
end

-- ✅ سریع: محلی یا const
const COUNTER = Ref(0)
function good()
    for i in 1:10^6
        COUNTER[] += 1
    end
end

۳. حافظه را از قبل تخصیص دهید

-- ❌ هر بار آرایه جدید
function slow()
    result = []
    for i in 1:1000
        push!(result, i^2)
    end
    return result
end

-- ✅ از قبل تخصیص
function fast()
    result = Vector{Int}(undef, 1000)
    for i in 1:1000
        result[i] = i^2
    end
    return result
end

۴. از توابع برداری استفاده کنید

-- همه سریع‌اند در جولیا:
sum(arr)           -- داخلی و بهینه
arr .^ 2           -- broadcast بهینه
[x^2 for x in arr] -- comprehension بهینه

Profile — پروفایل کد

using Profile

function work()
    total = 0
    for i in 1:10^7
        total += i
    end
    return total
end

work()   -- کامپایل
@profile work()
Profile.print()

چک‌لیست بهینه‌سازی

قانون طلایی: اول بنویسید، بعد اندازه بگیرید، فقط بعد بهینه کنید! «Premature optimization is the root of all evil»

این مبحث بخشی از دوره آموزش کامل جولیا است.

ابزارهای مرتبط