Anophel | آنوفل
159 subscribers
284 photos
300 links
آنوفل | Anophel: دنیای بی ‌پایان امکانات برای برنامه‌ نویسان

https://anophel.com

پشتیبانی :
@anophel_support
Download Telegram
💠داستان نشت حافظه در Map، مقایسه Go و Rust

فرض کنید یکی از سرویس‌های ساده‌ و تکرارشونده، به‌طور غیرمنتظره‌ای شروع به مصرف بیش‌ از حد حافظه کند. کد تغییری نکرده ، لاگ‌ها خطایی نشان نمی دهند، و پردازش‌ها همان روال همیشگی را طی می‌کنند. اما پس از حذف داده‌ها از map و حتی اجرای دستی GC، حافظه آزاد نمی شود، مصرف بالا ثابت مانده است.

بررسی کد
ساختار برنامه ساده بود: بارگذاری یک میلیون رکورد در حافظه، پردازش آن‌ها، حذف داده‌ها و تکرار این چرخه. پیاده‌سازی با زبان Go انجام شده بود و map اصلی به شکل زیر تعریف شده بود:
treasureChest := make(map[int][128]byte)
// پر کردن map
for i := 0; i < 1_000_000; i++ {
treasureChest[i] = [128]byte{}
}
// پردازش داده‌ها...
// پاک‌سازی map
for i := 0; i < 1_000_000; i++ {
delete(treasureChest, i)
}
runtime.GC() // اجرای دستی جمع‌آوری زباله

با وجود اجرای کامل delete روی کل map و همچنین فراخوانی مستقیم runtime.GC(), حافظه اشغال‌شده توسط برنامه به‌طور محسوسی کاهش نیافت.

💢علت رفتار Go
در Go، ساختار داخلی map به‌گونه‌ای طراحی شده که برای حفظ عملکرد، حافظه‌ی اختصاص‌یافته به bucketها را حتی پس از حذف مقادیر، بلافاصله آزاد نمی‌کند. این یعنی حتی زمانی‌که map منطقی خالی است، ساختار داده‌ای پشت آن همچنان بخش قابل‌توجهی از حافظه را نگه می‌دارد. جمع‌آورنده زباله (GC) نیز به‌دلیل باقی‌ماندن رفرنس‌های داخلی، این حافظه را آزاد نخواهد کرد — مگر در شرایط خاصی که بازسازی map یا اختصاص مجدد صورت گیرد.

📱مقایسه با Rust
برای ارزیابی رفتار متفاوت، همان سناریو در Rust با استفاده از HashMap پیاده‌سازی شد. پس از بارگذاری داده‌ها و استفاده از clear() برای حذف کامل محتوا، حافظه بلافاصله آزاد شد و مصرف به وضعیت اولیه بازگشت. در Rust، حافظه تحت مالکیت صریح داده‌هاست و زمانی که داده‌ها حذف می‌شوند، حافظه‌ی مربوط به آن‌ها نیز آزاد می‌شود؛ مگر این‌که عمداً نگه‌داری شود.

use std::collections::HashMap;

fn main() {
let mut treasure_chest: HashMap<u32, [u8; 128]> = HashMap::new();
for i in 0..1_000_000 {
treasure_chest.insert(i, [0u8; 128]);
}
// پردازش داده‌ها...
treasure_chest.clear(); // آزادسازی حافظه
}

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

نکته کلیدی: استفاده از map در زبان‌هایی مانند Go ممکن است رفتارهایی فراتر از سطح کد نشان دهد که در سناریوهای حساس به حافظه باید مورد توجه قرار گیرد. در شرایطی که کنترل دقیق بر حافظه لازم است، زبان‌هایی با مدل حافظه صریح‌تر مانند Rust انتخاب بهتری خواهند بود.

💙Anophel
Please open Telegram to view this post
VIEW IN TELEGRAM
💙gRPC چیست؟ راهنمای جامع فریمورک RPC مدرن

💠gRPC یک فریم‌ورک متن‌باز و مدرن برای فراخوانی رویه‌های راه‌دور (Remote Procedure Call یا RPC) است که با عملکرد بالا و کارایی بی‌نظیر در محیط‌های مختلف عمل می‌کند. این فریم‌ورک امکان ارتباط سریع و شفاف بین برنامه‌های کلاینت و سرور را فراهم می‌کند و از تعاملات درخواست/پاسخ معمولی تا ارتباطات استریمینگ طولانی‌مدت پشتیبانی می‌کند. در این مقاله، به بررسی چیستی gRPC، نحوه عملکرد آن، مزایا و معایب، و همچنین چالش‌های امنیتی مرتبط با آن می‌پردازیم.

🔗gRPC چیست؟ راهنمای جامع فریمورک RPC مدرن
Please open Telegram to view this post
VIEW IN TELEGRAM
💙وب‌سوکت چیست؟ راهنمای جامع تفاوت‌ها، کاربردها و مزایای WebSocket

🔻در دنیای دیجیتال امروز، ارتباط سریع و بلادرنگ بین کلاینت (کاربر) و سرور یکی از نیازهای اصلی برنامه‌های مدرن است. دو فناوری کلیدی که این ارتباط را ممکن می‌سازند، پروتکل HTTP و وب‌سوکت (WebSocket) هستند. اما این دو فناوری چگونه کار می‌کنند و چه تفاوت‌هایی دارند؟ چرا وب‌سوکت برای برنامه‌های بلادرنگ مانند چت آنلاین یا بازی‌های چندنفره انتخاب بهتری است؟ در این مقاله جامع، به بررسی عمیق وب‌سوکت، نحوه عملکرد …

🔗وب‌سوکت چیست؟ راهنمای جامع تفاوت‌ها، کاربردها و مزایای WebSocket
Please open Telegram to view this post
VIEW IN TELEGRAM
💙تفاوت gRPC و WebSocket: کدام فناوری برای پروژه شما مناسب‌تر است؟

🔺در دنیای توسعه وب و اپلیکیشن‌های مدرن، انتخاب فناوری مناسب برای برقراری ارتباط بلادرنگ (Real-Time) بین سرور و کلاینت یکی از تصمیمات کلیدی است. دو فناوری برجسته در این حوزه، gRPC و WebSocket، هر یک ویژگی‌ها و کاربردهای خاص خود را دارند. در این مقاله، به بررسی تفاوت‌های این دو فناوری، نقاط قوت و ضعف آن‌ها، و راهنمایی برای انتخاب بهترین گزینه برای پروژه شما می‌پردازیم.

تفاوت gRPC و WebSocket: کدام فناوری برای پروژه شما مناسب‌تر است؟🔗
Please open Telegram to view this post
VIEW IN TELEGRAM
💢وب اسمبلی و Go: راهنمای جامع ساخت برنامه‌های وب با عملکرد بالا

⭐️ در دنیای توسعه وب، نیاز به برنامه‌هایی با عملکرد بالا و مقیاس‌پذیر روزبه‌روز افزایش می‌یابد. WebAssembly (WASM) به‌عنوان یک فناوری نوظهور، امکان اجرای کدهای سطح پایین با سرعتی نزدیک به برنامه‌های نیتیو را در مرورگرها فراهم کرده است. وقتی این فناوری با زبان برنامه‌نویسی Go (Golang) ترکیب می‌شود، توسعه‌دهندگان می‌توانند برنامه‌های وب قدرتمند….

📱وب اسمبلی و Go: راهنمای جامع ساخت برنامه‌های وب با عملکرد بالا
Please open Telegram to view this post
VIEW IN TELEGRAM
💠بررسی جامع الگوریتم‌های رمزنگاری و معرفی پکیج CryptoLens

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

🌐بررسی جامع الگوریتم‌های رمزنگاری و معرفی پکیج CryptoLens

📱 لینک پکیج: CryptoLens کریپتولنز
Please open Telegram to view this post
VIEW IN TELEGRAM
💢بهینه‌سازی ساختارها (Structs) در زبان Go

🫶در زبان برنامه‌نویسی Go، ساختارها (Structs) به‌عنوان ظرف‌هایی برای داده‌ها عمل می‌کنند که امکان گروه‌بندی چندین فیلد با انواع مختلف را فراهم می‌کنند. این ویژگی، ساختارها را به ابزاری انعطاف‌پذیر برای سازمان‌دهی داده‌های مرتبط تبدیل کرده است. با این حال، نحوه تعریف و ترتیب فیلدها در یک ساختار می‌تواند تأثیر قابل‌توجهی بر عملکرد برنامه داشته باشد. در این مقاله، به بررسی بهینه‌سازی‌های مربوط به ساختارها در Go می‌پردازیم و تکنیک‌هایی را برای بهبود عملکرد حافظه و پردازشگر معرفی می‌کنیم.


🔗بهینه‌سازی ساختارها (Structs) در زبان Go
Please open Telegram to view this post
VIEW IN TELEGRAM