انجام یک محاسبه هش منفرد زمان زیادی جاوا یا سی شارپ برای اندروید نمی برد، بنابراین برای بدست آوردن یک معیار خوب، تابع هش 50000 بار نامیده می شود. در حین بهینه سازی برنامه، متوجه شدم که بهبود سرعت تبدیل از مقدار هش باینری به مقدار رشته، زمانبندی نسبی را به طور قابل توجهی تغییر داد. به عبارت دیگر هر تغییری، حتی کسری از ثانیه، 50000 برابر بزرگنمایی میشود.
اکنون هر مهندس نرم افزاری در این مورد می داند و این مشکل جدید نیست و غیر قابل حل نیست، با این حال می خواستم دو نکته کلیدی را بیان کنم. 1) من چندین ساعت برای بهینه سازی این کد وقت گذاشتم تا بهترین نتایج را از هر دو بخش جاوا و C برنامه بدست آوردم، اما خطاناپذیر نیستم و ممکن است بهینه سازی های بیشتری وجود داشته باشد. ۲) اگر توسعهدهنده اپلیکیشن هستید، بهینهسازی کدتان بخش مهمی از فرآیند توسعه اپلیکیشن است، آن را نادیده نگیرید.
در مورد این موضوع بیشتر بخوانیدشما جاوا یا سی شارپ برای اندروید به ما گفتید: اکثر شما از رم مجازی/گسترده روی گوشی خود استفاده نمی کنیدچگونه بازی های Steam را از دوستان خود مخفی کنید و آنها را خصوصی نگه داریدمرجع روزانه: 📉 سامسونگ بازده
پشتیبانی شده توسط Playwire
برنامه معیار من سه کار را انجام می دهد: ابتدا SHA1 یک بلوک داده را به طور مکرر در جاوا و سپس در C محاسبه می کند. سپس 1 میلیون عدد اول اول را با استفاده از آزمایش بر تقسیم محاسبه می کند، دوباره برای جاوا و C. در نهایت به طور مکرر یک عدد را اجرا می کند. تابع دلخواه که بسیاری از توابع ریاضی مختلف (ضرب، تقسیم، با اعداد صحیح، با اعداد ممیز شناور و غیره) را هم در جاوا و هم در C انجام می دهد.
دو آزمون آخر به ما اطمینان بالایی در مورد برابری توابع جاوا و C می دهد. جاوا از سبک و نحو زیادی از C استفاده می کند و به همین دلیل، برای توابع بی اهمیت، کپی کردن بین دو زبان بسیار جاوا یا سی شارپ برای اندروید آسان است. در زیر کدی برای آزمایش اینکه آیا عدد اول است (با استفاده از آزمایش بر اساس تقسیم) برای جاوا و سپس برای C وجود دارد، متوجه خواهید شد که آنها بسیار شبیه به هم هستند:
مقایسه سرعت اجرای کد مانند این به ما سرعت "خام" اجرای توابع ساده در هر دو زبان را نشان می دهد. با این حال، مورد آزمایش SHA1 کاملاً متفاوت است. دو مجموعه مختلف از توابع وجود دارد که می توان از آنها برای محاسبه هش استفاده کرد. یکی استفاده از توابع داخلی اندروید و دیگری استفاده از توابع خود.
مزیت اولی این است که عملکردهای اندروید بسیار بهینه خواهند شد، با ایرانیان سایبر این حال این نیز یک مشکل است زیرا به نظر می رسد بسیاری از نسخه های اندروید این توابع هش را در C پیاده سازی می کنند، و حتی زمانی که توابع API Android نامیده می شوند، برنامه در نهایت C را اجرا می کند. کد و نه کد جاوا.
بنابراین تنها راه حل این است که یک تابع SHA1 برای جاوا و یک تابع SHA1 برای C تهیه کنید و آن ها را اجرا کنید. با این حال، بهینه سازی دوباره یک مشکل است. محاسبه هش SHA1 پیچیده است و این توابع را می توان بهینه کرد. با این حال بهینه سازی یک تابع پیچیده سخت تر از بهینه سازی یک تابع ساده است. در پایان دو تابع (یکی در جاوا و یکی در C) پیدا کردم که بر اساس الگوریتم (و کد) منتشر شده در RFC 3174 – US Secure Hash Algorithm 1 (SHA1) هستند. من جاوا یا سی شارپ برای اندروید آنها را "همانطور که هست" بدون تلاش برای بهبود پیاده سازی اجرا کردم.
JVM های مختلف و طول کلمات مختلف
از آنجایی که ماشین مجازی جاوا یک بخش کلیدی در اجرای برنامههای جاوا است، توجه به این نکته مهم است که پیادهسازیهای مختلف JVM ویژگیهای عملکرد متفاوتی دارند. در دسکتاپ و سرور، JVM HotSpot است که توسط اوراکل منتشر شده است. با این حال اندروید JVM خود را دارد.
Android 4.4 KitKat و جاوا یا سی شارپ برای اندروید نسخههای قبلی اندروید از Dalvik استفاده میکردند که توسط Dan Bornstein نوشته شده بود، که نام آن را از نام دهکده ماهیگیری Dalvík در Eyjafjörður، ایسلند گرفته است. سالها به خوبی به اندروید خدمت کرد، اما از اندروید ۵.۰ به بعد، JVM پیشفرض به ART (زمان اجرای اندروید) تبدیل شد.
در حالی که Davlik به صورت پویا بخشهای کوتاه بایتکد اجرا شده را در کد ماشین اصلی (فرآیندی که به عنوان کامپایل به موقع شناخته میشود) کامپایل میکند، ART از کامپایل پیش از زمان (AOT) استفاده میکند که جاوا یا سی شارپ برای اندروید کل برنامه را در کد ماشین اصلی کامپایل میکند. نصب شده است. استفاده از AOT باید بازده اجرای کلی را بهبود بخشد و مصرف برق را کاهش دهد.