You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
<p>مثال بالا به شدت ساده شده است و بسیاری از جزئیات مانند مقادیر بازگشتی، اشارهگرهای فریم، آدرسهای بازگشت و درونخطیسازی (inlining) توابع را حذف کرده است. در واقع، از نسخه Go 1.17 به بعد، ممکن است برنامه بالا نیازی به فضای پشته نداشته باشد، زیرا مقدار کم داده میتواند توسط کامپایلر با استفاده از ثباتهای پردازنده (CPU registers) مدیریت شود. اما این مسئله مشکلی ایجاد نمیکند. این مدل همچنان به شما یک شهود معقول از نحوه تخصیص و حذف متغیرهای محلی در برنامههای پیچیدهتر Go روی پشته میدهد.</p>
4368
-
<p>شاید در این مرحله این سوال برای شما پیش بیاید که چه اتفاقی میافتد اگر فضای پشته تمام شود. در زبانهایی مانند C، این موضوع باعث خطای <em>سرریز پشته</em> (stack overflow) میشود. اما در Go، این مشکل به صورت خودکار با ایجاد یک نسخه کپی از پشته که دو برابر بزرگتر است، مدیریت میشود. این قابلیت به goroutineها اجازه میدهد که با پشتههای بسیار کوچک، معمولاً 2 کیلوبایت، شروع کنند و یکی از عوامل اصلی مقیاسپذیری بیشتر goroutineها نسبت به نخهای سیستمعامل همین موضوع است.</p>
4369
-
<p>یکی دیگر از جنبههای پشته، نحوه استفاده از آن در ایجاد <em>ردیابی پشته</em> (stack trace) است. این موضوع کمی پیشرفتهتر است، اما اگر علاقهمند هستید، میتوانید به مستندات «ردیابی پشته در Go» که در این مخزن موجود است، مراجعه کنید.</p>
4368
+
<p>شاید در این مرحله این سوال برای شما پیش بیاید که چه اتفاقی میافتد اگر فضای پشته تمام شود. در زبانهایی مانند C، این موضوع باعث خطای سرریز پشته (stack overflow) میشود. اما در Go، این مشکل به صورت خودکار با ایجاد یک نسخه کپی از پشته که دو برابر بزرگتر است، مدیریت میشود. این قابلیت به goroutineها اجازه میدهد که با پشتههای بسیار کوچک، معمولاً 2 کیلوبایت، شروع کنند و یکی از عوامل اصلی مقیاسپذیری بیشتر goroutineها نسبت به نخهای سیستمعامل همین موضوع است.</p>
4369
+
<p>یکی دیگر از جنبههای پشته، نحوه استفاده از آن در ایجاد ردیابی پشته (stack trace) است. این موضوع کمی پیشرفتهتر است، اما اگر علاقهمند هستید، میتوانید به مستندات «ردیابی پشته در Go» که در این مخزن موجود است، مراجعه کنید.</p>
Copy file name to clipboardExpand all lines: chapter-4/profiling/index.html
+1-1Lines changed: 1 addition & 1 deletion
Original file line number
Diff line number
Diff line change
@@ -62,7 +62,7 @@
62
62
</span></span><spanstyle=display:flex><spanstyle="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:.4em;padding:0 .4em;color:#7f7f7f" id=hl-1-7><astyle=outline:none;text-decoration:none;color:inherithref=#hl-1-7>7</a></span><span><spanstyle=color:#8be9fd;font-style:italic>func</span><spanstyle=color:#50fa7b>add</span>(a, b <spanstyle=color:#8be9fd>int</span>) <spanstyle=color:#8be9fd>int</span> {
63
63
</span></span><spanstyle=display:flex><spanstyle="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:.4em;padding:0 .4em;color:#7f7f7f" id=hl-1-8><astyle=outline:none;text-decoration:none;color:inherithref=#hl-1-8>8</a></span><span><spanstyle=color:#ff79c6>return</span> a <spanstyle=color:#ff79c6>+</span> b
</span></span></code></pre></div><p><strong>برای درک بهتر این موضوع، به مثال زیر توجه کنید:</strong></p><p>در اینجا یک تابع <code>main()</code> داریم که با رزرو مقداری فضا روی پشته برای متغیر <code>sum</code> شروع میشود. وقتی تابع <code>add()</code> فراخوانی میشود، یک فریم مخصوص برای نگه داشتن پارامترهای محلی <code>a</code> و <code>b</code> به آن اختصاص داده میشود. پس از اتمام اجرای <code>add()</code>، دادههای آن با بازگرداندن اشارهگر پشته به انتهای فریم تابع <code>main()</code> حذف میشوند و متغیر <code>sum</code> با نتیجه بهروز میشود. در همین حال، مقادیر قدیمی تابع <code>add()</code> فراتر از اشارهگر پشته باقی میمانند تا با فراخوانی بعدی تابع بازنویسی شوند. در زیر یک تصویرسازی از این فرآیند آمده است:</p><center><ahref=#><imgsrc=../../assets/img/content/chapter4/profiling/6.gifalt=stack></a></center><p>مثال بالا به شدت ساده شده است و بسیاری از جزئیات مانند مقادیر بازگشتی، اشارهگرهای فریم، آدرسهای بازگشت و درونخطیسازی (inlining) توابع را حذف کرده است. در واقع، از نسخه Go 1.17 به بعد، ممکن است برنامه بالا نیازی به فضای پشته نداشته باشد، زیرا مقدار کم داده میتواند توسط کامپایلر با استفاده از ثباتهای پردازنده (CPU registers) مدیریت شود. اما این مسئله مشکلی ایجاد نمیکند. این مدل همچنان به شما یک شهود معقول از نحوه تخصیص و حذف متغیرهای محلی در برنامههای پیچیدهتر Go روی پشته میدهد.</p><p>شاید در این مرحله این سوال برای شما پیش بیاید که چه اتفاقی میافتد اگر فضای پشته تمام شود. در زبانهایی مانند C، این موضوع باعث خطای <em>سرریز پشته</em> (stack overflow) میشود. اما در Go، این مشکل به صورت خودکار با ایجاد یک نسخه کپی از پشته که دو برابر بزرگتر است، مدیریت میشود. این قابلیت به goroutineها اجازه میدهد که با پشتههای بسیار کوچک، معمولاً 2 کیلوبایت، شروع کنند و یکی از عوامل اصلی مقیاسپذیری بیشتر goroutineها نسبت به نخهای سیستمعامل همین موضوع است.</p><p>یکی دیگر از جنبههای پشته، نحوه استفاده از آن در ایجاد <em>ردیابی پشته</em> (stack trace) است. این موضوع کمی پیشرفتهتر است، اما اگر علاقهمند هستید، میتوانید به مستندات «ردیابی پشته در Go» که در این مخزن موجود است، مراجعه کنید.</p><h4id=425122-هیپ-heap>4.25.1.2.2 هیپ (Heap)
65
+
</span></span></code></pre></div><p><strong>برای درک بهتر این موضوع، به مثال زیر توجه کنید:</strong></p><p>در اینجا یک تابع <code>main()</code> داریم که با رزرو مقداری فضا روی پشته برای متغیر <code>sum</code> شروع میشود. وقتی تابع <code>add()</code> فراخوانی میشود، یک فریم مخصوص برای نگه داشتن پارامترهای محلی <code>a</code> و <code>b</code> به آن اختصاص داده میشود. پس از اتمام اجرای <code>add()</code>، دادههای آن با بازگرداندن اشارهگر پشته به انتهای فریم تابع <code>main()</code> حذف میشوند و متغیر <code>sum</code> با نتیجه بهروز میشود. در همین حال، مقادیر قدیمی تابع <code>add()</code> فراتر از اشارهگر پشته باقی میمانند تا با فراخوانی بعدی تابع بازنویسی شوند. در زیر یک تصویرسازی از این فرآیند آمده است:</p><center><ahref=#><imgsrc=../../assets/img/content/chapter4/profiling/6.gifalt=stack></a></center><p>مثال بالا به شدت ساده شده است و بسیاری از جزئیات مانند مقادیر بازگشتی، اشارهگرهای فریم، آدرسهای بازگشت و درونخطیسازی (inlining) توابع را حذف کرده است. در واقع، از نسخه Go 1.17 به بعد، ممکن است برنامه بالا نیازی به فضای پشته نداشته باشد، زیرا مقدار کم داده میتواند توسط کامپایلر با استفاده از ثباتهای پردازنده (CPU registers) مدیریت شود. اما این مسئله مشکلی ایجاد نمیکند. این مدل همچنان به شما یک شهود معقول از نحوه تخصیص و حذف متغیرهای محلی در برنامههای پیچیدهتر Go روی پشته میدهد.</p><p>شاید در این مرحله این سوال برای شما پیش بیاید که چه اتفاقی میافتد اگر فضای پشته تمام شود. در زبانهایی مانند C، این موضوع باعث خطای سرریز پشته (stack overflow) میشود. اما در Go، این مشکل به صورت خودکار با ایجاد یک نسخه کپی از پشته که دو برابر بزرگتر است، مدیریت میشود. این قابلیت به goroutineها اجازه میدهد که با پشتههای بسیار کوچک، معمولاً 2 کیلوبایت، شروع کنند و یکی از عوامل اصلی مقیاسپذیری بیشتر goroutineها نسبت به نخهای سیستمعامل همین موضوع است.</p><p>یکی دیگر از جنبههای پشته، نحوه استفاده از آن در ایجاد ردیابی پشته (stack trace) است. این موضوع کمی پیشرفتهتر است، اما اگر علاقهمند هستید، میتوانید به مستندات «ردیابی پشته در Go» که در این مخزن موجود است، مراجعه کنید.</p><h4id=425122-هیپ-heap>4.25.1.2.2 هیپ (Heap)
66
66
<aclass=anchorhref=#425122-%d9%87%db%8c%d9%be-heap>#</a></h4><p>تخصیصهای پشته عالی هستند، اما در بسیاری از موارد Go نمیتواند از آنها استفاده کند. رایجترین حالت زمانی است که باید اشارهگری به یک متغیر محلی از یک تابع بازگردانده شود. این موضوع را میتوان در نسخه اصلاحشده مثال تابع <code>add()</code> که در بالا آمد، مشاهده کرد:</p><divclass=highlight><pretabindex=0style=color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><codeclass=language-godata-lang=go><spanstyle=display:flex><spanstyle="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:.4em;padding:0 .4em;color:#7f7f7f" id=hl-2-1><astyle=outline:none;text-decoration:none;color:inherithref=#hl-2-1>1</a></span><span><spanstyle=color:#8be9fd;font-style:italic>func</span><spanstyle=color:#50fa7b>main</span>() {
0 commit comments