کارایی و بهینهسازی در جولیا
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()
چکلیست بهینهسازی
- ☐ توابع type-stable هستند؟
- ☐ متغیر سراسری در حلقه داغ نیست؟
- ☐ آرایهها از قبل تخصیص یافتهاند؟
- ☐ @time دو بار اجرا شده؟
- ☐ از توابع داخلی استفاده شده؟
قانون طلایی: اول بنویسید، بعد اندازه بگیرید، فقط بعد بهینه کنید! «Premature optimization is the root of all evil»
این مبحث بخشی از دوره آموزش کامل جولیا است.