ইনলাইন সমাবেশের ভাষাটি কি সি সি ++ কোডের চেয়ে ধীর?


183

আমি ইনলাইন সমাবেশ ভাষা এবং সি ++ কোডের পারফরম্যান্সের সাথে তুলনা করার চেষ্টা করেছি, তাই আমি একটি ফাংশন লিখেছি যা 100000 বারের জন্য 2000 আকারের দুটি অ্যারে যুক্ত করে। কোডটি এখানে:

#define TIMES 100000
void calcuC(int *x,int *y,int length)
{
    for(int i = 0; i < TIMES; i++)
    {
        for(int j = 0; j < length; j++)
            x[j] += y[j];
    }
}


void calcuAsm(int *x,int *y,int lengthOfArray)
{
    __asm
    {
        mov edi,TIMES
        start:
        mov esi,0
        mov ecx,lengthOfArray
        label:
        mov edx,x
        push edx
        mov eax,DWORD PTR [edx + esi*4]
        mov edx,y
        mov ebx,DWORD PTR [edx + esi*4]
        add eax,ebx
        pop edx
        mov [edx + esi*4],eax
        inc esi
        loop label
        dec edi
        cmp edi,0
        jnz start
    };
}

এখানে main():

int main() {
    bool errorOccured = false;
    setbuf(stdout,NULL);
    int *xC,*xAsm,*yC,*yAsm;
    xC = new int[2000];
    xAsm = new int[2000];
    yC = new int[2000];
    yAsm = new int[2000];
    for(int i = 0; i < 2000; i++)
    {
        xC[i] = 0;
        xAsm[i] = 0;
        yC[i] = i;
        yAsm[i] = i;
    }
    time_t start = clock();
    calcuC(xC,yC,2000);

    //    calcuAsm(xAsm,yAsm,2000);
    //    for(int i = 0; i < 2000; i++)
    //    {
    //        if(xC[i] != xAsm[i])
    //        {
    //            cout<<"xC["<<i<<"]="<<xC[i]<<" "<<"xAsm["<<i<<"]="<<xAsm[i]<<endl;
    //            errorOccured = true;
    //            break;
    //        }
    //    }
    //    if(errorOccured)
    //        cout<<"Error occurs!"<<endl;
    //    else
    //        cout<<"Works fine!"<<endl;

    time_t end = clock();

    //    cout<<"time = "<<(float)(end - start) / CLOCKS_PER_SEC<<"\n";

    cout<<"time = "<<end - start<<endl;
    return 0;
}

তারপরে আমি প্রসেসরের চক্র পেতে পাঁচবার প্রোগ্রামটি চালাচ্ছি, যা সময় হিসাবে দেখা যেতে পারে। প্রতিবার আমি উপরে উল্লিখিত ফাংশনটির একটি কল করি।

এবং এখানে ফলাফল আসে।

সমাবেশ সংস্করণ ফাংশন:

Debug   Release
---------------
732        668
733        680
659        672
667        675
684        694
Average:   677

সি ++ সংস্করণটির কার্যকারিতা:

Debug     Release
-----------------
1068      168
 999      166
1072      231
1002      166
1114      183
Average:  182

রিলিজ মোডে সি ++ কোডটি এসেম্বলি কোডের চেয়ে প্রায় 3.7 গুণ বেশি দ্রুত। কেন?

আমি অনুমান করি যে আমি যে অ্যাসেম্বলি কোডটি লিখেছি তা জিসিসি দ্বারা তৈরি করা হিসাবে কার্যকর নয়। আমার মতো একজন সাধারণ প্রোগ্রামারের পক্ষে একটি কম্পাইলার দ্বারা উত্পাদিত প্রতিপক্ষের তুলনায় কোডটি দ্রুত লেখার পক্ষে শক্ত that এর অর্থ কী আমার নিজের হাতে লেখা সংসদীয় ভাষার সম্পাদনের উপর বিশ্বাস করা উচিত নয়, সি ++ এ ফোকাস করা উচিত এবং সমাবেশের ভাষাটি ভুলে যাওয়া উচিত?


29
যথেষ্ট. হ্যান্ডকোডযুক্ত সমাবেশটি কিছু পরিস্থিতিতে উপযুক্ত, তবে উচ্চ স্তরের ভাষার ভাষা অর্জনের চেয়ে অ্যাসেম্বলি সংস্করণটি সত্যই দ্রুততর হয় তা নিশ্চিত করার জন্য অবশ্যই যত্নবান হতে হবে।
ম্যাগনাস হফ

161
সংকলকটির দ্বারা উত্পন্ন কোডটি অধ্যয়ন করা আপনার শিক্ষণীয় মনে হতে পারে এবং এটি কেন আপনার সমাবেশের সংস্করণের চেয়ে দ্রুত try
পল আর

34
হ্যাঁ, দেখে মনে হচ্ছে সংকলকটি আপনার চেয়ে asm লেখার ক্ষেত্রে আরও ভাল। আধুনিক সংকলক সত্যিই বেশ ভাল।
ডেভিড হেফারনান

20
জিসিসি উত্পাদিত সমাবেশটি কি আপনি দেখেছেন? এর সম্ভাব্য জিসিসি এমএমএক্স নির্দেশাবলী ব্যবহার করেছে। আপনার ফাংশনটি খুব সমান্তরাল - আপনি সম্ভাব্যভাবে 1 / N এর মধ্যে যোগফলটি গণনা করতে এন প্রসেসরগুলি ব্যবহার করতে পারেন। এমন কোনও ফাংশন চেষ্টা করুন যেখানে সমান্তরালনের কোনও আশা নেই।
ক্রিস

11
এইচএম, আমি এটি একটি ভাল 100,000
ডলার

উত্তর:


261

হ্যাঁ, বেশিরভাগ সময়

সবার আগে আপনি ভুল ধারণা থেকে শুরু করেন যে একটি নিম্ন-স্তরের ভাষা (এই ক্ষেত্রে সমাবেশ) সর্বদা উচ্চ-স্তরের ভাষার (এই ক্ষেত্রে সি ++ এবং সি) চেয়ে দ্রুত কোড তৈরি করে। এটা সত্য নয়. সি কোড কি সবসময় জাভা কোডের চেয়ে দ্রুত হয়? না কারণ আরও একটি পরিবর্তনশীল রয়েছে: প্রোগ্রামার। আপনি আর্কিটেকচারের বিশদ সম্পর্কিত কোড এবং জ্ঞানটি যেভাবে লিখেছেন তা কার্য সম্পাদনকে ব্যাপকভাবে প্রভাবিত করে (আপনি যেমনটি দেখেছেন)।

আপনি সর্বদা একটি উদাহরণ তৈরি করতে পারেন যেখানে হস্তনির্মিত অ্যাসেমব্লিং কোডটি সংকলিত কোডের চেয়ে ভাল তবে সাধারণত এটি একটি কাল্পনিক উদাহরণ বা একক রুটিন নয় , সি ++ কোডের 500.000+ লাইনের সত্যিকারের প্রোগ্রাম নয় )। আমি মনে করি সংকলকগণ 95% বার এবং কখনও কখনও কেবলমাত্র বিরল সময়ে আরও ভাল এসেম্বলি কোড তৈরি করতে পারে , আপনাকে কয়েকটি, সংক্ষিপ্ত, অতি ব্যবহৃত , পারফরম্যান্স সমালোচনামূলক রুটিনগুলির জন্য বা আপনার পছন্দসই উচ্চ স্তরের ভাষার বৈশিষ্ট্যগুলি অ্যাক্সেস করতে হবে তখন আপনাকে অ্যাসেম্বলি কোড লিখতে হবে may প্রকাশ করা হয় না। আপনি কি এই জটিলতার ছোঁয়া চান? এসওতে এই দুর্দান্ত উত্তরটি পড়ুন ।

কেন এটা?

প্রথমত কারণ সংকলকগণ অপ্টিমাইজেশন করতে পারে যা আমরা কল্পনাও করতে পারি না ( এই সংক্ষিপ্ত তালিকাটি দেখুন ) এবং তারা সেগুলি কয়েক সেকেন্ডে করবে (যখন আমাদের কিছু দিনের প্রয়োজন হতে পারে )।

আপনি যখন সমাবেশে কোড করেন তখন আপনাকে একটি সংজ্ঞায়িত কল ইন্টারফেসের সাথে সু-সংজ্ঞায়িত ফাংশন করতে হবে। তবে তারা পুরো প্রোগ্রামের অপ্টিমাইজেশন এবং আন্ত-প্রক্রিয়াগত অপ্টিমাইজেশান যেমন নিবন্ধক বরাদ্দ , ধ্রুবক প্রচার , সাধারণ সুপ্রপ্রেস নির্মূলকরণ , নির্দেশের সময়সূচী এবং অন্যান্য জটিল, সুস্পষ্ট অপ্টিমাইজেশানগুলি ( উদাহরণস্বরূপ পলিটোপ মডেল ) গ্রহণ করতে পারে না। উপর আরআইএসসি স্থাপত্য বলছি এই অনেক বছর আগে সম্পর্কে উদ্বেজক বন্ধ (নির্দেশ সিডিউলিং, উদাহরণস্বরূপ, খুব কঠিন হয় হাত দ্বারা সুর ) এবং আধুনিক CISC সিপিইউ খুব দীর্ঘ আছে পাইপলাইনগুলি খুব।

কিছু জটিল মাইক্রোকন্ট্রোলারদের জন্য এমনকি সিস্টেম লাইব্রেরিগুলি সমাবেশের পরিবর্তে সিতে লেখা হয় কারণ তাদের সংকলকগুলি একটি ভাল (এবং বজায় রাখা সহজ) চূড়ান্ত কোড উত্পাদন করে।

সংকলকগণ কখনও কখনও নিজেরাই কিছু এমএমএক্স / সিমডেক্স নির্দেশাবলী স্বয়ংক্রিয়ভাবে ব্যবহার করতে পারেন এবং আপনি সেগুলি ব্যবহার না করলে আপনি কেবল তুলনা করতে পারবেন না (অন্যান্য উত্তর ইতিমধ্যে আপনার সমাবেশ কোডটি খুব ভালভাবে পর্যালোচনা করেছে)। শুধু লুপগুলির জন্য এটি একটি সংকলক দ্বারা সাধারণত যা যাচাই করা হয় তার লুপ অপ্টিমাইজেশনের একটি সংক্ষিপ্ত তালিকা (আপনি কি মনে করেন যে আপনি নিজের সিডি # সি প্রোগ্রামের সিদ্ধান্ত নেওয়ার পরে নিজেই এটি করতে পেরেছিলেন?) আপনি যদি সমাবেশে কিছু লিখেন তবে আমি মনে হয় আপনাকে কমপক্ষে কিছু সাধারণ অপ্টিমাইজেশান বিবেচনা করতে হবে । অ্যারেগুলির জন্য স্কুল-বইয়ের উদাহরণটি হ'ল চক্রটি আনرول করা (এর আকারটি সংকলন সময়ে জানা যায়)। এটি করুন এবং আবার আপনার পরীক্ষা চালান।

এই দিনগুলিতে অন্য কারণে এসেম্বলির ভাষা ব্যবহার করা সত্যই অস্বাভাবিক: বিভিন্ন সিপিইউর আধিক্য । আপনি কি তাদের সকলকে সমর্থন করতে চান? প্রত্যেকের একটি নির্দিষ্ট মাইক্রোআরকিটেকচার এবং কিছু নির্দিষ্ট নির্দেশের সেট রয়েছে । তাদের বিভিন্ন সংখ্যক কার্যকরী ইউনিট রয়েছে এবং তাদের সমস্ত ব্যস্ত রাখার জন্য সমাবেশ নির্দেশাবলীর ব্যবস্থা করা উচিত । আপনি যদি সি তে লিখেন তবে আপনি পিজিও ব্যবহার করতে পারেন তবে সমাবেশে আপনার তখন সেই নির্দিষ্ট আর্কিটেকচারের একটি দুর্দান্ত জ্ঞানের প্রয়োজন হবে (এবং অন্য স্থাপত্যের জন্য পুনর্বিবেচনা করুন এবং সবকিছু পুনরায় করুন )। ছোট ছোট কাজের জন্য সংকলক সাধারণত এটি আরও ভাল করে এবং জটিল কাজের জন্য সাধারণত কাজটি শোধ করা হয় না (এবংসংকলক যাইহোক ভাল করতে পারে )।

আপনি যদি বসে থাকেন এবং আপনার কোডটি একবার দেখে থাকেন সম্ভবত আপনি দেখতে পাবেন যে আপনার নিজের অ্যালগরিদমকে আবার ডিজাইনিং করতে আরও বেশি উপার্জন পাবেন অ্যাসেম্বলিতে অনুবাদ করার চেয়ে (এসওতে এই দুর্দান্ত পোস্টটি পড়ুন ), উচ্চ স্তরের অপ্টিমাইজেশন রয়েছে (এবং সংকলন করার ইঙ্গিতগুলি) আপনার সমাবেশের ভাষা অবলম্বন করার আগে আপনি কার্যকরভাবে প্রয়োগ করতে পারেন। এটি সম্ভবত উল্লেখ করার মতো যে প্রায়শই অভ্যন্তরীণ ব্যবহারগুলি ব্যবহার করে আপনার সন্ধানের জন্য পারফরম্যান্স পাবেন এবং সংকলক এখনও এর বেশিরভাগ অপ্টিমাইজেশন সম্পাদন করতে সক্ষম হবেন।

সকল এই কথা, এমনকি যখন আপনি একটি 5 ~ 10 গুণ বেশি দ্রুত সমাবেশ কোড তৈরী করতে পারে, যদি তারা পছন্দ আপনি আপনার গ্রাহকদের জিজ্ঞাসা করা উচিত দিতে এক সপ্তাহ আপনার সময় বা 50 $ দ্রুত CPU- র কিনতে । চূড়ান্ত অপ্টিমাইজেশন প্রায়শই না করা হয় (এবং বিশেষত এলওবি অ্যাপ্লিকেশনগুলিতে) কেবল আমাদের বেশিরভাগেরই প্রয়োজন হয় না।


9
অবশ্যই না. আমি মনে করি এটি 99% সময়ের মধ্যে 95% লোকের চেয়ে ভাল। কখনও কখনও এটি ব্যয়বহুল ( জটিল গণিতের কারণে ) বা সময় ব্যয় করার (কারণ আবার ব্যয়বহুল) হয়ে থাকে because কখনও কখনও কারণ আমরা সহজেই অপ্টিমাইজেশানগুলি ভুলে গিয়েছিলাম ...
অ্যাড্রিয়ানো রেপিটি

62
@ জা 72 - না, কোড লেখার চেয়ে এটি ভাল নয় । কোডটি অনুকূলিতকরণে এটি আরও ভাল ।
মাইক বারানজাক

14
আপনি সত্যিই এটি বিবেচনা না করা পর্যন্ত এটি পাল্টা স্বজ্ঞাত। একইভাবে, ভিএম ভিত্তিক মেশিনগুলি রানটাইম অপ্টিমাইজেশন করতে শুরু করছে যা সংকলকগুলির কাছে কেবল তেমন তথ্য নেই।
বিল কে

6
@ এম 28: সংকলকরা একই নির্দেশাবলী ব্যবহার করতে পারেন। অবশ্যই, তারা বাইনারি আকারের ক্ষেত্রে এটির জন্য অর্থ প্রদান করে (কারণ এই নির্দেশাবলী সমর্থিত না হলে ইভেন্টে তাদের ফ্যালব্যাক পাথ সরবরাহ করতে হবে)। এছাড়াও, বেশিরভাগ অংশে, "নতুন নির্দেশাবলী" যুক্ত হবে তা হ'ল এসএমআইডি নির্দেশাবলী, যা ভিএম এবং সংকলক উভয়ই ব্যবহার করতে বেশ ভয়ঙ্কর। ভিএমগুলি এই বৈশিষ্ট্যের জন্য অর্থ প্রদান করে যে তারা শুরুতে কোড সংকলন করতে হবে।
বিলি ওনিল

9
@ বিলক: পিজিও কম্পাইলারদের জন্য একই কাজ করে।
বিলি ওনিল

194

আপনার অ্যাসেম্বলি কোডটি সাবমোটিমাল এবং উন্নত হতে পারে:

  • আপনি আপনার অভ্যন্তরীণ লুপে একটি রেজিস্টার ( EDX ) চাপছেন এবং পপ করছেন । এটি লুপের বাইরে সরানো উচিত।
  • আপনি লুপের প্রতিটি পুনরাবৃত্তিতে অ্যারে পয়েন্টারগুলি পুনরায় লোড করুন। এটি লুপ থেকে সরানো উচিত।
  • আপনি সেই loopনির্দেশটি ব্যবহার করেন যা বেশিরভাগ আধুনিক সিপিইউগুলিতে (সম্ভবত একটি প্রাচীন সমাবেশ বই ব্যবহারের ফলস্বরূপ) মৃতরূপে পরিচিত is
  • আপনি ম্যানুয়াল লুপ আনরোলিংয়ের কোনও সুবিধা গ্রহণ করবেন না।
  • আপনি উপলভ্য সিমডি নির্দেশাবলী ব্যবহার করবেন না ।

সুতরাং যদি না আপনি এসেম্বলারের বিষয়ে আপনার দক্ষতা-সেটটি ব্যাপকভাবে উন্নত করেন, পারফরম্যান্সের জন্য এসেম্বলার কোডটি লেখার পক্ষে আপনার কোনও অর্থ হয় না।

* অবশ্যই জানি না আপনি loopকোনও প্রাচীন সমাবেশ বই থেকে সত্যই নির্দেশনা পেয়েছিলেন কিনা । তবে আপনি এটিকে প্রায়শই রিয়েল ওয়ার্ল্ড কোডে দেখতে পাবেন না, কারণ প্রতিটি সংকলক এখানে নির্গত না হওয়ার মতো যথেষ্ট স্মার্ট loop, আপনি কেবল এটি IMHO খারাপ এবং পুরানো বইগুলিতে দেখতে পাবেন।



1
@ ফুকলভ ভাল হ্যাঁ, তবে মূল প্রশ্নটি ছিল ঠিক গতি সম্পর্কে, আকার নয়।
IGR94

60

এমনকি সমাবেশে প্রবেশের আগে, কোড ট্রান্সফর্মেশনগুলি রয়েছে যা একটি উচ্চ স্তরে বিদ্যমান।

static int const TIMES = 100000;

void calcuC(int *x, int *y, int length) {
  for (int i = 0; i < TIMES; i++) {
    for (int j = 0; j < length; j++) {
      x[j] += y[j];
    }
  }
}

লুপ রোটেশনের মাধ্যমে রূপান্তরিত হতে পারে :

static int const TIMES = 100000;

void calcuC(int *x, int *y, int length) {
    for (int j = 0; j < length; ++j) {
      for (int i = 0; i < TIMES; ++i) {
        x[j] += y[j];
      }
    }
}

যা স্মৃতি লোকালয়ের যতদূর যায়।

এটি আরও অনুকূল হতে পারে, a += bএক্স বার করা আমাদের সমান করার সমতুল্য a += X * b:

static int const TIMES = 100000;

void calcuC(int *x, int *y, int length) {
    for (int j = 0; j < length; ++j) {
      x[j] += TIMES * y[j];
    }
}

তবে মনে হচ্ছে আমার প্রিয় অপ্টিমাইজার (এলএলভিএম) এই রূপান্তরটি সম্পাদন করে না।

[সম্পাদনা] আমি দেখেছি যে রূপান্তর যদি আমরা ছিল সঞ্চালিত হয় restrictকরতে কোয়ালিফায়ার xএবং y। প্রকৃতপক্ষে এই বিধিনিষেধ ছাড়াই, x[j]এবং y[j]একই স্থানে উপন্যাস তৈরি করতে পারে যা এই রূপান্তরটি ভুল করে। [শেষ সম্পাদনা]

যাই হোক, এই হয়, আমি মনে করি, অপ্টিমাইজ সি সংস্করণ। ইতিমধ্যে এটি অনেক সহজ। এর উপর ভিত্তি করে, এএসএম-এ আমার ক্র্যাকটি এখানে রয়েছে (আমি কলংটি এটি তৈরি করতে দিয়েছি, আমি এতে অকেজো)

calcuAsm:                               # @calcuAsm
.Ltmp0:
    .cfi_startproc
# BB#0:
    testl   %edx, %edx
    jle .LBB0_2
    .align  16, 0x90
.LBB0_1:                                # %.lr.ph
                                        # =>This Inner Loop Header: Depth=1
    imull   $100000, (%rsi), %eax   # imm = 0x186A0
    addl    %eax, (%rdi)
    addq    $4, %rsi
    addq    $4, %rdi
    decl    %edx
    jne .LBB0_1
.LBB0_2:                                # %._crit_edge
    ret
.Ltmp1:
    .size   calcuAsm, .Ltmp1-calcuAsm
.Ltmp2:
    .cfi_endproc

আমি আশঙ্কা করছি যে এই সমস্ত নির্দেশাবলী কোথা থেকে এসেছে তা আমি বুঝতে পারি না তবে আপনি সবসময় মজা করতে পারেন এবং চেষ্টা করতে পারেন এবং এটির তুলনা কীভাবে করা যায় ... তবে আমি এখনও কোডটি, সমাবেশের পরিবর্তে অনুকূলিত সি সংস্করণটি ব্যবহার করব, আরও অনেক বহনযোগ্য।


আপনার উত্তরের জন্য ধন্যবাদ eআচ্ছা, এটি একটু বিভ্রান্তিকর যে আমি যখন "সংকলক নীতিগুলি" নামক ক্লাসটি গ্রহণ করি তখন শিখেছি যে সংকলকটি আমাদের কোডকে অনেক উপায়ে অপ্টিমাইজ করবে। এর অর্থ কি আমাদের নিজের কোডটি ম্যানুয়ালি অপ্টিমাইজ করতে হবে? আমরা কি সংকলকটির চেয়ে আরও ভাল কাজ করতে পারি? এই প্রশ্নটি আমাকে সর্বদা বিভ্রান্ত করে।
ব্যবহারকারী 957121

2
@ ব্যবহারকারী 957121: আমাদের আরও তথ্য থাকলে আমরা এটিকে আরও ভাল করতে পারি। বিশেষ করে এখানে কি কম্পাইলার পথে অন্তরায় সম্ভব এলিয়াসিং মধ্যে xএবং y। অর্থাৎ কম্পাইলার নিশ্চিন্ত হন যে সমস্ত যে হতে পারে না i,j[0, length)আমরা আছে x + i != y + j। যদি ওভারল্যাপ থাকে তবে অপটিমাইজেশন অসম্ভব। সি ল্যাঙ্গুয়েজটি মূলশব্দটি চালু করে restrictসংকলককে জানিয়েছিল যে দুটি পয়েন্টার উপনাম করতে পারে না, তবে এটি অ্যারেগুলির জন্য কাজ করে না কারণ তারা এখনও ঠিক না থাকলেও ওভারল্যাপ করতে পারে।
ম্যাথিউ এম।

বর্তমান জিসিসি এবং কলং অটো-ভেক্টরাইজ (আপনি বাদ দিলে অ-ওভারল্যাপ পরীক্ষা করার পরে __restrict)। এসএসই 2 এক্স x86-64 এর জন্য বেসলাইন, এবং সাফিংয়ের মাধ্যমে এসএসই 2 একবারে 2x 32-বিট গুণিত করতে পারে (64৪-বিট পণ্য উত্পাদন করে, ফলস্বরূপ একসাথে ফিরিয়ে আনার জন্য এলোমেলো)। Godbolt.org/z/r7F_uo । (এসএসই 4.1 এর জন্য প্রয়োজন pmulld: 32x32 => 32-বিট গুণিত প্যাক করা)। জিসিসির ধ্রুবক সংখ্যার গুণককে শিফট / অ্যাড (এবং / বা বিয়োগ) এ পরিণত করার ঝরঝরে কৌশল রয়েছে যা কয়েকটি বিট সেট সহ গুণকগুলির পক্ষে ভাল good ক্ল্যাংয়ের সাফল্য-ভারী কোড ইন্টেল সিপিইউগুলিতে শফল থ্রুপুটটিতে বাধা দিতে চলেছে।
পিটার

41

সংক্ষিপ্ত উত্তর: হ্যাঁ

দীর্ঘ উত্তর: হ্যাঁ, যদি না আপনি সত্যিই জানেন যে আপনি কী করছেন এবং এটি করার কারণ নেই।


3
এবং কেবলমাত্র যদি আপনি কোনও সমাবেশে লেভেল প্রোফাইলিংয়ের সরঞ্জামটি চালিয়ে থাকেন যেমন আপনি ভিটুনের মতো চিপগুলির জন্য ভিটিউনের মতো জিনিসগুলি ব্যবহার করতে পারেন যেখানে আপনি কোন জিনিসে উন্নতি করতে পারবেন
মার্ক মুলিন

1
এটি প্রযুক্তিগতভাবে প্রশ্নের উত্তর দেয় তবে এটি সম্পূর্ণ অকেজো। আমার কাছ থেকে A -1।
নবীন

2
খুব দীর্ঘ উত্তর: "। হ্যাঁ, যদি না আপনি আপনার পুরো কোড পরিবর্তন যখনই একটি নতুন (ER) CPU- র ব্যবহার করা হয় মত মনে শ্রেষ্ঠ অ্যালগরিদম চয়ন করুন, কিন্তু কম্পাইলার অপ্টিমাইজেশন করতে দেওয়া"
Tommylee2k

35

আমি আমার এসএম কোডটি স্থির করেছি:

  __asm
{   
    mov ebx,TIMES
 start:
    mov ecx,lengthOfArray
    mov esi,x
    shr ecx,1
    mov edi,y
label:
    movq mm0,QWORD PTR[esi]
    paddd mm0,QWORD PTR[edi]
    add edi,8
    movq QWORD PTR[esi],mm0
    add esi,8
    dec ecx 
    jnz label
    dec ebx
    jnz start
};

রিলিজ সংস্করণের ফলাফল:

 Function of assembly version: 81
 Function of C++ version: 161

রিলিজ মোডে অ্যাসেম্বলি কোডটি সি ++ এর থেকে প্রায় 2 গুণ বেশি দ্রুত।


18
এখন আপনি যদি এমএমএক্সের পরিবর্তে এসএসই ব্যবহার শুরু করেন (নিবন্ধটির নাম xmm0পরিবর্তে নাম রয়েছে mm0), আপনি দুটি ;-) এর একটি ফ্যাক্টর দ্বারা অন্য একটি
স্পিডআপ পাবেন

8
আমি পরিবর্তিত হয়েছি, সমাবেশ সংস্করণে 41 পেয়েছি। এটি 4 বারের মধ্যে দ্রুত :)
শাশা

3
এছাড়াও আরো 5% পর্যন্ত পেতে পারেন যদি ব্যবহার সব XMM রেজিস্টার
Sasha

7
এখন আপনি যদি সময়টি মনে করেন যে এটি আপনাকে আসলে কীভাবে নিয়েছে: সমাবেশ, প্রায় 10 ঘন্টা বা তার বেশি? সি ++, কয়েক মিনিট আমার অনুমান? পারফরম্যান্স-সমালোচনামূলক কোড না থাকলে এখানে একটি স্পষ্ট বিজয়ী রয়েছে।
ক্যালিমো

1
একটি ভাল সংকলক ইতিমধ্যে অটো-ভেক্টরাইজ করবে paddd xmm(এর মধ্যে ওভারল্যাপ পরীক্ষা করার পরে xএবং yআপনি ব্যবহার করেন নি বলে int *__restrict x)। উদাহরণস্বরূপ জিসিসি এটি করে: Godbolt.org/z/c2JG0- । অথবা ইনলাইনিংয়ের পরে main, ওভারল্যাপটি পরীক্ষা করার দরকার নেই কারণ এটি বরাদ্দটি দেখতে পারে এবং প্রমাণ করতে পারে যে তারা অ-ওভারল্যাপিং করছে। (এবং এটি কিছু x86-64 বাস্তবায়নের উপর 16-বাইট প্রান্তিককরণটি ধরে নিতে পারে, এটিও একক সংজ্ঞায়নের ক্ষেত্রে নয়)) এবং আপনি যদি এটি সংকলন করেন gcc -O3 -march=native, আপনি 256-বিট বা 512-বিট পেতে পারেন vectorization।
পিটার কর্ডেস

24

তার মানে কি আমার নিজের হাতে লেখা সমাবেশ ভাষাগুলির পারফরম্যান্সের উপর বিশ্বাস করা উচিত নয়

হ্যাঁ, এটির অর্থ হ'ল এটি প্রতিটি ভাষাতেই সত্য । আপনি যদি এক্স ভাষায় দক্ষ কোড লিখতে জানেন না, তবে এক্স তে দক্ষ কোড লেখার আপনার দক্ষতার উপর বিশ্বাস করা উচিত নয় so সুতরাং, আপনি যদি দক্ষ কোড চান, আপনার অন্য ভাষা ব্যবহার করা উচিত।

সমাবেশ এটি সম্পর্কে বিশেষত সংবেদনশীল, কারণ, ভাল, আপনি যা দেখেন তা হ'ল আপনি যা পান। আপনি সিপিইউ কার্যকর করতে চান সেই সুনির্দিষ্ট নির্দেশাবলী লিখুন। উচ্চ স্তরের ভাষাগুলির সাথে, বেটউইনে একটি সংকলক রয়েছে, যা আপনার কোডকে রূপান্তর করতে পারে এবং অনেক অদক্ষতা দূর করতে পারে। সমাবেশ সহ, আপনি নিজেরাই আছেন।


2
আমি মনে করি এটি লিখতে হয়েছে যাতে বিশেষত একটি আধুনিক x86 প্রসেসরের জন্য পাইপলাইন, একাধিক এক্সিকিউশন ইউনিট এবং প্রতিটি কোরের অভ্যন্তরে অন্যান্য গিমিকগুলির উপস্থিতির কারণে দক্ষ সমাবেশ কোডটি ব্যতিক্রমীভাবে কঠিন। সর্বোচ্চ সম্পাদন গতি পেতে এই সমস্ত সংস্থাগুলির ব্যবহারকে ভারসাম্যপূর্ণ রাইটিং কোডের ফলে প্রায়শই অবিচ্ছিন্ন যুক্তিযুক্ত কোড তৈরি হয় যা "প্রচলিত" সমাবেশের জ্ঞান অনুযায়ী "দ্রুত" হওয়া উচিত নয়। তবে কম জটিল সিপিইউগুলির জন্য এটি আমার অভিজ্ঞতা যে সি সংযোজকের কোড জেনারেশনটি উল্লেখযোগ্যভাবে আরও ভাল করা যেতে পারে।
অলিফ ফোর্শেল

4
সি সংকলক কোডগুলি সাধারণত একটি আধুনিক x86 সিপিইউতেও আরও ভাল করা যেতে পারে। তবে আপনাকে সিপিইউটি ভালভাবে বুঝতে হবে, যা আধুনিক x86 সিপিইউর সাথে করা শক্ত। এটাই আমার বক্তব্য। আপনি যে হার্ডওয়্যারটি টার্গেট করছেন তা যদি আপনি বুঝতে না পারেন তবে আপনি এটির জন্য অনুকূলিত করতে পারবেন না। এবং তারপরে সংকলক সম্ভবত আরও ভাল কাজ করবে
জাল্ফ

1
এবং আপনি যদি সত্যিই সংকলকটি উড়িয়ে দিতে চান তবে আপনাকে সৃজনশীল হতে হবে এবং সংকলকটি যেভাবে পারে না তার উপায়গুলি অনুকূল করতে হবে। এটি সময় / পুরষ্কারের জন্য ট্রেড অফ তাই সে কারণেই সি অন্যের জন্য উচ্চ স্তরের ভাষার জন্য কিছু এবং মধ্যবর্তী কোডের স্ক্রিপ্টিং ভাষা। আমার জন্য যদিও, সমাবেশ মজাদার জন্য বেশি :)। অনেক মত grc.com/smgassembly.htm
Hawken

22

আজকাল অ্যাসেম্বলি ভাষা ব্যবহারের একমাত্র কারণ হ'ল কিছু বৈশিষ্ট্য যা ভাষা দ্বারা অ্যাক্সেসযোগ্য নয় use

এটি প্রযোজ্য:

  • কার্নেল প্রোগ্রামিং যা MMU এর মতো নির্দিষ্ট হার্ডওয়্যার বৈশিষ্ট্যগুলিতে অ্যাক্সেস করতে হবে
  • উচ্চ কার্যকারিতা প্রোগ্রামিং যা খুব নির্দিষ্ট ভেক্টর বা মাল্টিমিডিয়া নির্দেশাবলী ব্যবহার করে আপনার সংকলক দ্বারা সমর্থিত নয়।

তবে বর্তমান সংকলকগুলি বেশ স্মার্ট, তারা এমনকি পৃথক দুটি স্টেটমেন্ট প্রতিস্থাপন করতে পারে d = a / b; r = a % b;যা একক নির্দেশাবলীর সাথে যা বিভাগকে গণনা করে এবং যদি এটি উপলব্ধ থাকে তবে একযোগে বাকী থাকে, এমনকি সি এর কাছে অপারেটর না থাকলেও।


10
এএসএমের জন্য এই দুটি ছাড়াও অন্যান্য জায়গা রয়েছে। অর্থাত্, পতাকাগুলি এবং গুণনের উপরের অংশে অ্যাক্সেস থাকার কারণে একটি বিগনাম লাইব্রেরি সাধারণত সি এর তুলনায় এএসএম-তে উল্লেখযোগ্যভাবে দ্রুত হয়। আপনি পোর্টেবল সিতেও এই জিনিসগুলি করতে পারেন তবে সেগুলি খুব ধীর।
মাকিং হাঁস

@ মুভিংডাক এটিকে সম্ভবত হার্ডওয়্যার হার্ডওয়্যার বৈশিষ্ট্যগুলি অ্যাক্সেস হিসাবে বিবেচনা করা যেতে পারে যা সরাসরি ভাষায় উপলভ্য নয় ... তবে যতক্ষণ না আপনি কেবলমাত্র আপনার উচ্চ স্তরের কোডটি হাতছাড়া করে অ্যাসেমব্লিতে অনুবাদ করছেন, সংকলক আপনাকে মারবে।
ফোরট্রান

1
এটি এটি, তবে এটি কার্নেল প্রোগ্রামিং নয়, বা বিক্রেতা নির্দিষ্ট নয়। যদিও কাজের সামান্য পরিবর্তন সহ, এটি সহজেই যে কোনও বিভাগে পড়তে পারে। আইডি অনুমান করে ASM যখন আপনি প্রসেসরের নির্দেশাবলীর কার্য সম্পাদন করতে চান যেখানে কোনও সি ম্যাপিং নেই।
মাকিং হাঁস

1
@ ফিফর্টান আপনার মূলত এই কথাটি বলা হচ্ছে যে আপনি যদি আপনার কোডটি অপ্টিমাইজ না করেন তবে এটি সংকলকটি অনুকূলিত কোডের মতো দ্রুত হবে না। অপ্টিমাইজেশন হ'ল কারণ যে কেউ প্রথম স্থানে সমাবেশ লিখবে। আপনি যদি অনুবাদটি বোঝাতে চান তবে অনুকূলিতকরণের কোনও কারণ নেই কারণ আপনি সমাবেশটি অনুকূলকরণের ক্ষেত্রে ভাল না হলে সংকলক আপনাকে মারবে। তাই সংকলককে বীট দেওয়ার জন্য আপনাকে সংকলকটি যেভাবে করতে পারে না তার উপায়ে অনুকূল করতে হবে। এটি বেশ স্ব ব্যাখ্যাযোগ্য। সমাবেশ লেখার একমাত্র কারণ হ'ল আপনি যদি সংকলক / দোভাষীর চেয়ে ভাল হন । এটি সর্বদা সমাবেশ লিখার ব্যবহারিক কারণ ছিল।
হক্কেন

1
কেবল বলেছি: অন্তর্নির্মিত ফাংশনগুলির মাধ্যমে কলংয়ের ক্যারি ফ্ল্যাগগুলি, 128 বিট গুণ এবং আরও কিছুতে অ্যাক্সেস রয়েছে। এবং এটি এগুলিকে তার সাধারণ অপ্টিমাইজেশান অ্যালগরিদমের সাথে একীভূত করতে পারে।
gnasher729

19

এটি সত্য যে একটি আধুনিক সংকলক কোড অপ্টিমাইজেশনে একটি আশ্চর্যজনক কাজ করে, তবুও আমি আপনাকে অ্যাসেম্বলি শিখতে উত্সাহিত করব।

সবার আগে আপনি এ থেকে স্পষ্টতই ভয় পান না , এটি একটি দুর্দান্ত, দুর্দান্ত প্লাস, এরপরে - আপনার গতি অনুমানগুলি যাচাই বা বাতিল করতে আপনি সঠিক প্রোফাইলের উপরে আছেন , আপনি অভিজ্ঞ ব্যক্তিদের কাছ থেকে ইনপুট চেয়েছেন এবং আপনি মানবজাতির কাছে সবচেয়ে বেশি অনুকূলকরণের সরঞ্জাম রয়েছে: মস্তিষ্ক

আপনার অভিজ্ঞতা বাড়ার সাথে সাথে আপনি কখন এবং কোথায় এটি ব্যবহার করবেন তা শিখবেন (সাধারণত আপনার কোডের মধ্যে সবচেয়ে কঠোরতম, অন্তর্লীন লুপগুলি পরে, আপনি অ্যালগরিদমিক স্তরে গভীরভাবে অনুকূলিত হওয়ার পরে)।

অনুপ্রেরণার জন্য আমি আপনাকে মাইকেল আব্রাশের নিবন্ধগুলি সন্ধান করার পরামর্শ দিচ্ছি (যদি আপনি তাঁর কাছ থেকে কিছু না শুনে থাকেন তবে তিনি একটি অপ্টিমাইজেশন গুরু; তিনি কোয়ান্টাম সফটওয়্যার রেন্ডারারের অপ্টিমাইজেশনে জন কারম্যাকের সাথেও সহযোগিতা করেছিলেন!)

"দ্রুততম কোডের মতো কোনও জিনিস নেই" - মাইকেল আবরাশ


2
আমি বিশ্বাস করি মাইকেল আবরাশ বইয়ের একটি গ্রাফিক্স প্রোগ্রামিং ব্ল্যাক বই। তবে তিনি কেবল সমাবেশই ব্যবহার করেননি, ক্রিস সাওয়ের নিজেই সমাবেশে প্রথম দুটি রোলার কোস্টার টাইকুন গেমস লিখেছিলেন।
হকেন

14

আমি asm কোড পরিবর্তন করেছি:

 __asm
{ 
    mov ebx,TIMES
 start:
    mov ecx,lengthOfArray
    mov esi,x
    shr ecx,2
    mov edi,y
label:
    mov eax,DWORD PTR [esi]
    add eax,DWORD PTR [edi]
    add edi,4   
    dec ecx 
    mov DWORD PTR [esi],eax
    add esi,4
    test ecx,ecx
    jnz label
    dec ebx
    test ebx,ebx
    jnz start
};

রিলিজ সংস্করণের ফলাফল:

 Function of assembly version: 41
 Function of C++ version: 161

রিলিজ মোডে অ্যাসেম্বলি কোডটি সি ++ এর থেকে প্রায় 4 গুণ বেশি দ্রুত। আইএমএইচও, সমাবেশ কোডের গতি নির্ভর করে প্রোগ্রামার থেকে


হ্যাঁ, আমার কোডটি সত্যই অপ্টিমাইজ করা দরকার youআপনার জন্য ভাল কাজ এবং ধন্যবাদ!
ব্যবহারকারী 957121

5
এটি চারগুণ দ্রুত কারণ আপনি কেবল কাজের একটি চতুর্থাংশ কাজ করেন :-) shr ecx,2এটি অতিমাত্রায় হয়, কারণ অ্যারের দৈর্ঘ্য ইতিমধ্যে intবাইটে দেওয়া হয়নি এবং দেওয়া হয়েছে । সুতরাং আপনি মূলত একই গতি অর্জন। আপনি padddহরোল্ডস উত্তর থেকে চেষ্টা করতে পারেন , এটি সত্যিই দ্রুত হবে।
গুন্থার পাইজ

13

এটি খুব আকর্ষণীয় বিষয়!
আমি সাশার কোডে এসএমই দ্বারা এমএমএক্স পরিবর্তন করেছি
এখানে আমার ফলাফলগুলি:

Function of C++ version:      315
Function of assembly(simply): 312
Function of assembly  (MMX):  136
Function of assembly  (SSE):  62

এসএসই সহ সমাবেশ কোড সি ++ এর চেয়ে 5 গুণ বেশি দ্রুত


12

বেশিরভাগ উচ্চ-স্তরের ভাষা সংকলকগুলি খুব অনুকূলিত হয় এবং তারা কী করছে তা জানে। আপনি বিচ্ছিন্ন কোডটি চেষ্টা ও ডাম্প করতে পারেন এবং এটি আপনার স্থানীয় সমাবেশের সাথে তুলনা করতে পারেন। আমি বিশ্বাস করি যে আপনি কয়েকটি সুন্দর কৌশল দেখতে পাবেন যা আপনার সংকলকটি ব্যবহার করছে।

যেমন উদাহরণস্বরূপ, এমনকি আমি নিশ্চিত যে এটি এখন আর ঠিক নেই :):

এরকম:

mov eax,0

চেয়ে বেশি চক্র ব্যয়

xor eax,eax

যা একই জিনিস করে।

সংকলক এই সমস্ত কৌশল জানে এবং সেগুলি ব্যবহার করে।


4
তবুও সত্য, স্ট্যাকওভারফ্লো . com/ প্রশ্নগুলি / 1396527/… দেখুন । ব্যবহৃত চক্রের কারণে নয়, মেমরির পদক্ষেপ হ্রাসের কারণে।
গুন্থার পাইজ

10

সংকলক তোমাকে মারছে। আমি চেষ্টা করে দেখব, তবে আমি কোনও গ্যারান্টি দিচ্ছি না। আমি ধরে নেব যে টিআইএমইএসের দ্বারা "গুণ" এটি আরও প্রাসঙ্গিক পারফরম্যান্স পরীক্ষা করার জন্য বোঝানো হয়েছে, এটি yএবং x16-প্রান্তিক, এবং এটি length4-এর একটি অ-শূন্য একাধিক, এটি যাইহোক সম্ভবত সমস্ত সত্য।

  mov ecx,length
  lea esi,[y+4*ecx]
  lea edi,[x+4*ecx]
  neg ecx
loop:
  movdqa xmm0,[esi+4*ecx]
  paddd xmm0,[edi+4*ecx]
  movdqa [edi+4*ecx],xmm0
  add ecx,4
  jnz loop

আমি যেমন বলেছি, আমি কোনও গ্যারান্টি রাখি না। তবে আমি আরও অবাক হব যদি এটি আরও দ্রুত করা যায় - তবে এখানে এলটেনেক মেমরির থ্রুটপুট এমনকি সমস্ত কিছু এল 1 হিট হলেও।


আমি মনে করি জটিল ঠিকানাটি আপনার কোডটি কমিয়ে দিচ্ছে, আপনি যদি কোডটি পরিবর্তন করেন mov ecx, length, lea ecx,[ecx*4], mov eax,16... add ecx,eaxএবং তারপরে [esi + ecx] সর্বত্র ব্যবহার করুন আপনি লুপ প্রচুর গতি বাড়ানোর নির্দেশনা অনুযায়ী 1 টি চক্র স্টল এড়াতে পারবেন। (আপনার কাছে যদি সর্বশেষতম স্কাইলেক থাকে তবে এটি প্রয়োগ হয় না)। অ্যাড রেজি, রেগ কেবল লুপটিকে আরও শক্ত করে তোলে যা সাহায্য করতে পারে বা নাও পারে।
জোহান

@ জোহান যে স্টল হওয়া উচিত নয়, কেবল একটি অতিরিক্ত চক্রের বিলম্ব, তবে নিশ্চিত যে এটি না পেলে ক্ষতি করতে পারে না .. আমি কোর 2 এর জন্য এই কোডটি লিখেছিলাম যাতে এই সমস্যাটি ছিল না। R + r কি "জটিল" বিটিডাব্লুও নয়?
8:25 এ হারোড

7

সমাবেশে অন্ধভাবে ঠিক একই অ্যালগরিদম প্রয়োগ করে, নির্দেশের মাধ্যমে নির্দেশনাটি, সমাবেশে কম্পাইলার যা করতে পারে তার চেয়ে ধীর গতির গ্যারান্টিযুক্ত

এটি কারণ ছোট সংক্ষিপ্ততর অপ্টিমাইজেশন সংকলকটিও আপনার অনমনীয় কোডের চেয়ে কোনও অপ্টিমাইজেশন ছাড়াই ভাল।

অবশ্যই, সংকলকটি বীট করা সম্ভব, বিশেষত যদি এটি কোডের একটি ছোট, স্থানীয়ীকৃত অংশ হয় তবে প্রায় কাছাকাছি পেতে আমাকে নিজেই এটি করতে হয়েছিল। 4x গতি বাড়িয়েছে, তবে এই ক্ষেত্রে আমাদের হার্ডওয়ার এবং অসংখ্য, আপাতদৃষ্টিতে পাল্টা স্বজ্ঞাত কৌশলগুলি সম্পর্কে ভাল জ্ঞানের উপর নির্ভর করতে হবে।


3
আমি মনে করি এটি ভাষা এবং সংকলকের উপর নির্ভর করে। আমি একটি অত্যন্ত অদক্ষ সি সংকলক কল্পনা করতে পারি যার আউটপুট সহজেই কোনও মানব লেখার দ্বারা সরাসরি পরাস্ত হতে পারে assembly জিসিসি, তেমন কিছু না।
কেসি রডর্মার

সি / ++ সংকলকগুলির যেমন একটি উদ্যোগ গ্রহণ করা হয় এবং চারপাশে কেবলমাত্র 3 টি প্রধান থাকে, তারা যা করেন তাতে তার চেয়ে ভাল হতে থাকে। এটি এখনও (খুব) কিছু পরিস্থিতিতে সম্ভব যে হাতে লিখিত সমাবেশটি আরও দ্রুত হবে; একাধিক / প্রশস্ত মানকে আরও ভালভাবে পরিচালনা করতে প্রচুর গণিত গ্রন্থাগার asm এ নেমে আসে। সুতরাং গ্যারান্টিযুক্তটি কিছুটা শক্তিশালী হলেও এটি সম্ভবত।
ssube

@ পেচেকেন: আমি এই বলতে চাইনি যে সাধারণভাবে সাধারণভাবে সি ++ এর চেয়ে ধীর গতির গ্যারান্টি দেওয়া হয়। আমি বলতে চাইছি "গ্যারান্টি" সেই ক্ষেত্রে যেখানে আপনার কাছে সি ++ কোড রয়েছে এবং অন্ধভাবে এটি লাইন দিয়ে সমাবেশে অনুবাদ করুন। আমার উত্তরের শেষ অনুচ্ছেদটিও পড়ুন :)
বনাম

5

সংকলক হিসাবে আমি একটি নির্ধারিত আকারের সাথে একটি লুপকে প্রচুর কার্যকর কার্যের সাথে প্রতিস্থাপন করব।

int a = 10;
for (int i = 0; i < 3; i += 1) {
    a = a + i;
}

উত্পাদন করবে

int a = 10;
a = a + 0;
a = a + 1;
a = a + 2;

এবং অবশেষে এটি জানতে পারবেন যে "a = a + 0;" এটি অকার্যকর তাই এটি এই লাইনটি সরিয়ে ফেলবে। আশা করি আপনার মাথায় এমন কিছু এখন একটি মন্তব্য হিসাবে কিছু অপ্টিমাইজেশান বিকল্প সংযুক্ত করতে ইচ্ছুক। এই সমস্ত কার্যকর কার্যকর অপ্টিমাইজেশানগুলি সংকলিত ভাষাটিকে আরও দ্রুততর করে তুলবে।


4
এবং যদি aঅস্থির না হয় তবে একটি ভাল সুযোগ রয়েছে যে সংকলকটি int a = 13;প্রথম থেকেই এটি করবে ।
বনাম


4

আমি এই উদাহরণটি ভালবাসি কারণ এটি নিম্ন-স্তরের কোড সম্পর্কে একটি গুরুত্বপূর্ণ পাঠ প্রদর্শন করে। হ্যাঁ, আপনি আপনার সি কোডের মতোই অ্যাসেম্বলি লিখতে পারেন । এটি টোটোলজিক্যালি সত্য, তবে অগত্যা কোনও অর্থ নয়। স্পষ্টতই কেউ পারেন, অন্যথায় এসেম্বলারের উপযুক্ত অপ্টিমাইজেশন জানতে পারবেন না।

একইভাবে, আপনি ভাষা বিমূর্তনের শ্রেণিবিন্যাসের উপরে উঠার সাথে একই নীতিটি প্রযোজ্য। হ্যাঁ, আপনি সি-তে একটি পার্সার লিখতে পারেন যা দ্রুত এবং নোংরা পার্ল স্ক্রিপ্টের মতো দ্রুত এবং অনেক লোক তা করে। তবে এর অর্থ এই নয় যে আপনি সি ব্যবহার করেছেন বলে আপনার কোডটি দ্রুত হবে। অনেক ক্ষেত্রে উচ্চ স্তরের ভাষাগুলি এমন অপ্টিমাইজেশন করে যা আপনি কখনও ভাবেননি।


3

বেশিরভাগ ক্ষেত্রে, কিছু কার্য সম্পাদন করার সর্বোত্তম উপায়টি সেই প্রসঙ্গের উপর নির্ভর করতে পারে যেখানে টাস্কটি সম্পাদিত হয়। যদি একটি রুটিন অ্যাসেম্বলি ভাষায় রচিত হয়, তবে সাধারণত নির্দেশের অনুক্রমের প্রসঙ্গে ভিত্তিতে বৈচিত্রময় করা সম্ভব হবে না। একটি সাধারণ উদাহরণ হিসাবে, নিম্নলিখিত সহজ পদ্ধতিটি বিবেচনা করুন:

inline void set_port_high(void)
{
  (*((volatile unsigned char*)0x40001204) = 0xFF);
}

উপরোক্ত প্রদত্ত 32-বিট এআরএম কোডের জন্য একটি সংকলক সম্ভবত এটিকে এমন কিছু হিসাবে রেন্ডার করবে:

ldr  r0,=0x40001204
mov  r1,#0
strb r1,[r0]
[a fourth word somewhere holding the constant 0x40001204]

অথবা সম্ভবত

ldr  r0,=0x40001000  ; Some assemblers like to round pointer loads to multiples of 4096
mov  r1,#0
strb r1,[r0+0x204]
[a fourth word somewhere holding the constant 0x40001000]

এটি হ্যান্ডেল-এসেম্বল কোডে কিছুটা অনুকূলিত হতে পারে, যেমন হয়:

ldr  r0,=0x400011FF
strb r0,[r0+5]
[a third word somewhere holding the constant 0x400011FF]

অথবা

mvn  r0,#0xC0       ; Load with 0x3FFFFFFF
add  r0,r0,#0x1200  ; Add 0x1200, yielding 0x400011FF
strb r0,[r0+5]

উভয় হাতে জড়িত পদ্ধতির জন্য 16 টির পরিবর্তে 12 বাইট কোড স্পেসের প্রয়োজন হবে; পরেরটি একটি "যুক্ত" এর সাথে "লোড" প্রতিস্থাপন করবে, যা একটি এআরএম 7-টিডিএমআইতে দুটি চক্র দ্রুত চালিত করবে। কোডটি যদি এমন কোনও প্রসঙ্গে কার্যকর করা যাচ্ছিল যেখানে r0 জানা ছিল না / জানা নেই - সংবিধানের ভাষা সংস্করণগুলি সংকলিত সংস্করণটির চেয়ে কিছুটা ভাল হতে পারে। অন্যদিকে, ধরুন যে সংকলকটি জানত যে কিছু রেজিস্টার [উদাহরণস্বরূপ r5] পছন্দসই ঠিকানার 0x40001204 [উদাহরণস্বরূপ 0x40001000] এর 2047 বাইটের মধ্যে একটি মান রাখতে চলেছে এবং আরও জানত যে আরও কিছু নিবন্ধক [যেমন r7] যাচ্ছেন এমন মান ধরে রাখতে যার কম বিট 0xFF ছিল। সেক্ষেত্রে একটি সংকলক কোডটির সি সংস্করণটিকে কেবলমাত্র অনুকূলিত করতে পারে:

strb r7,[r5+0x204]

হ্যান্ড-অপ্টিমাইজড অ্যাসেমব্লিং কোডের চেয়েও অনেক খাটো এবং দ্রুত। আরও ধরা যাক, সেট_পোর্ট_পরে প্রসঙ্গটি ঘটেছে:

int temp = function1();
set_port_high();
function2(temp); // Assume temp is not used after this

এম্বেড থাকা সিস্টেমের জন্য কোডিং করার সময় মোটেই অনুচ্চার্য নয়। যদি set_port_highঅ্যাসেম্বলি কোডে লেখা থাকে, সংকলকটি function1সমাবেশ কোডটি আহ্বান করার আগে আর কোথাও আর -0 (যা থেকে প্রত্যাবর্তনের মান ধারণ করে ) নিয়ে যেতে হবে, এবং তারপরে সেই মানটি r0-এ ফিরে যেতে function2হবে (যেহেতু এটির প্রথম প্যারামিটারটি r0 তে আশা করবে), সুতরাং "অনুকূলিত" সমাবেশের কোডটির জন্য পাঁচটি নির্দেশাবলীর প্রয়োজন। সংকলকটি ঠিকানা বা সংরক্ষণের মান রাখার জন্য কোনও রেজিস্টারগুলি না জানলেও এর চার-নির্দেশাবলীর সংস্করণ (এটি যে কোনও উপলভ্য রেজিস্টারগুলি ব্যবহার করার জন্য অভিযোজিত করতে পারে - প্রয়োজনে r0 এবং r1 নয়) "অনুকূলিত" সমাবেশকে পরাজিত করবে ভাষা সংস্করণ। পূর্বে বর্ণিত অনুসারে যদি সংকলকটির r5 এবং r7 তে প্রয়োজনীয় ঠিকানা এবং ডেটা থাকে, function1তবে সেগুলি রেজিস্টারগুলিতে পরিবর্তন করা হত না, এবং সুতরাং এটি প্রতিস্থাপন করতে পারেset_port_highএকটি একক strbনির্দেশের সাথে - "হ্যান্ড-অপটিমাইজড" সমাবেশ কোডের চেয়ে চারটি নির্দেশ ছোট এবং দ্রুত smaller

নোট করুন যে হ্যান্ড-অপ্টিমাইজড অ্যাসেমব্লিং কোড প্রায়শই এমন ক্ষেত্রে একটি সংকলককে কার্যকর করতে পারে যেখানে প্রোগ্রামার সুনির্দিষ্ট প্রোগ্রামের প্রবাহটি জানে, তবে সংস্থাপকরা সেই ক্ষেত্রে প্রাসঙ্গিকভাবে আলোকিত করে যেখানে কোডের টুকরোটি প্রাসঙ্গিকতার আগে জানা যায়, বা যেখানে উত্স কোডের এক অংশ হতে পারে একাধিক প্রসঙ্গ থেকে আহ্বান জানানো হয়েছে [যদি set_port_highকোডের পঞ্চাশটি পৃথক স্থানে ব্যবহার করা হয় তবে সংকলক স্বতন্ত্রভাবে সিদ্ধান্ত নিতে পারে যে প্রত্যেকটি কীভাবে এটি প্রসারিত করতে পারে]।

সাধারণভাবে, আমি প্রস্তাব দেব যে সংসদীয় ভাষা সেই ক্ষেত্রে সর্বাধিক কর্মক্ষমতা উন্নতি করতে উপযুক্ত যেখানে কোডের প্রতিটি অংশকে খুব সীমিত সংখ্যার সাথে সংযোগ করা যেতে পারে, এবং এমন জায়গাগুলিতে পারফরম্যান্সের জন্য ক্ষতিকারক হতে প্রস্তুত যেখানে কোনও অংশ রয়েছে piece কোড অনেক বিভিন্ন প্রসঙ্গে থেকে যোগাযোগ করা যেতে পারে। মজার বিষয় (এবং সুবিধাজনকভাবে) যেগুলি ক্ষেত্রে কার্য সম্পাদনের পক্ষে সমাবেশ সবচেয়ে উপকারী তা প্রায়শই সেই ক্ষেত্রে হয় যেখানে কোডটি সবচেয়ে সহজ এবং সহজভাবে পড়তে পারে। অ্যাসেম্বলি ভাষার কোডগুলি যে জায়গাগুলি গুয়ে মেসে পরিণত করবে সেগুলি প্রায়শই এমন হয় যেখানে সমাবেশে লেখা ক্ষুদ্রতম কর্মক্ষমতা সুবিধা দেয় offer

[মাইনর নোট: এমন কয়েকটি জায়গা রয়েছে যেখানে অ্যাসেমব্লি কোডটি হাইপার-অপ্টিমাইজড গুই গণ্ডগোলের জন্য ব্যবহার করা যেতে পারে; উদাহরণস্বরূপ, এআরএমের জন্য র‌্যামের কাছ থেকে একটি শব্দ আনতে এবং মূল্যটির উপরের ছয়টি বিটের উপর ভিত্তি করে প্রায় বারোটি রুটিনগুলির মধ্যে একটি নির্বাহ করার জন্য কোডের এক টুকরোটি করেছিলাম (একই মানটিতে ম্যাপযুক্ত অনেক মান)) আমি মনে করি যে আমি এই কোডটি এমন কিছুতে অনুকূলিত করেছি:

ldrh  r0,[r1],#2! ; Fetch with post-increment
ldrb  r1,[r8,r0 asr #10]
sub   pc,r8,r1,asl #2

আর 8 রেজিস্টার সর্বদা মূল প্রেরণের টেবিলের ঠিকানা রাখে (লুপের মধ্যে যেখানে কোডটি তার সময়ের 98% সময় ব্যয় করে, কিছুই অন্য কোনও উদ্দেশ্যে কখনও ব্যবহার করে না); সমস্ত 64 টি এন্ট্রি তার আগে 256 বাইটে ঠিকানাগুলিতে উল্লেখ করেছে। যেহেতু প্রাথমিক লুপটি বেশিরভাগ ক্ষেত্রে প্রায় 60 টি চক্রের কঠোর প্রয়োগের সময়সীমা ছিল তাই নয়-চক্রটি আনতে এবং পাঠানো সেই লক্ষ্যটি অর্জনের জন্য খুব সহায়ক ছিল। 256 32-বিট ঠিকানার একটি টেবিল ব্যবহার করা এক চক্র দ্রুততর হতে পারে তবে 1KB খুব মূল্যবান র‌্যামের গ্যাবলড হত [ফ্ল্যাশটিতে একাধিক অপেক্ষার অবস্থান যুক্ত করা হত]। 32৪-বিট অ্যাড্রেস ব্যবহারের জন্য আনতে হবে এমন শব্দ থেকে কিছু বিটকে মুখোশ দেওয়ার জন্য একটি নির্দেশ যুক্ত করতে হবে এবং আমি যে টেবিলটি ব্যবহার করেছি তা তার চেয়ে আরও বেশি 192 বাইট গাবলড হয়ে থাকতে পারে। 8-বিট অফসেটের সারণীটি ব্যবহার করে খুব কমপ্যাক্ট এবং দ্রুত কোড পাওয়া গেছে, তবে এমন কিছু নয় যা আমি আশা করি যে সংকলকটি কখনই সামনে আসবে; আমি কোনও সংকলক টেবিলের ঠিকানাটি ধরে রাখার জন্য একটি "নিখরচায়" একটি নিবন্ধক উত্সর্গ করার আশাও করব না।

উপরের কোডটি একটি স্ব-অন্তর্ভুক্ত সিস্টেম হিসাবে চালানোর জন্য ডিজাইন করা হয়েছিল; এটি পর্যায়ক্রমে সি কোড কল করতে পারে, তবে কেবলমাত্র নির্দিষ্ট সময়ে যখন হার্ডওয়্যারটি নিরাপদে যোগাযোগ করে তা নিরাপদ অবস্থায় প্রতি 16 মিনিটে দুটি-এক-মিলিসেকেন্ড অন্তর অন্তর একটি "অলস" অবস্থানে স্থাপন করতে পারে।


2

সাম্প্রতিক সময়ে, আমি যে সমস্ত গতি অপ্টিমাইজেশান করেছি তা হ'ল মস্তিষ্কের ক্ষতিগ্রস্থ ধীর কোডগুলি কেবল যুক্তিসঙ্গত কোডের সাথে প্রতিস্থাপন করেছিল। তবে বিষয়গুলির জন্য গতি ছিল সত্যিই সমালোচনামূলক এবং আমি দ্রুত কিছু তৈরিতে গুরুতর প্রচেষ্টা করেছি, ফলটি সর্বদা একটি পুনরাবৃত্তি প্রক্রিয়া ছিল, যেখানে প্রতিটি পুনরাবৃত্তি সমস্যার আরও অন্তর্দৃষ্টি দেয়, কীভাবে কম অপারেশন দিয়ে সমস্যাটি সমাধান করার উপায়গুলি খুঁজে বের করে। চূড়ান্ত গতিটি সর্বদা নির্ভর করে যে আমি সমস্যার মধ্যে কতটা অন্তর্দৃষ্টি পেয়েছি তার উপর। যদি কোনও পর্যায়ে আমি অ্যাসেম্বলি কোড বা সি কোড ব্যবহার করি যা অত্যধিক অনুকূলিত হয়েছিল, তবে আরও ভাল সমাধানের প্রক্রিয়াটি ভুগতে পারত এবং শেষের ফলাফলটি ধীর হয়ে যেত।


2

আপনি যদি সঠিক উপায়ে গভীর জ্ঞানের সাথে সমাবেশ ভাষা ব্যবহার না করেন তবে সি ++ দ্রুত হয় +

আমি যখন এএসএম-এ কোড করি, আমি নির্দেশাবলীটিকে ম্যানুয়ালি পুনরায় সংগঠিত করি যাতে যুক্তিযুক্তভাবে সম্ভব হলে সিপিইউ তাদের আরও সমান্তরালে সম্পাদন করতে পারে। আমি ASM তে কোড দেওয়ার সময় আমি সবেই র‍্যাম ব্যবহার করি উদাহরণস্বরূপ: ASM এ 20000+ কোডের লাইন থাকতে পারে এবং আমি একবার পুশ / পপ ব্যবহার করি নি।

স্ব-সংশোধনকারী কোডের সম্ভাব্য জরিমানা ছাড়াই কোড ও আচরণটি স্ব-সংশোধন করতে আপনি অপকডের মাঝখানে ঝাঁপিয়ে পড়তে পারেন। রেজিস্টারগুলিতে অ্যাক্সেস করতে সিপিইউতে 1 টি টিক লাগে (মাঝে মাঝে 25 টিকিট লাগে) RAM

আমার শেষ এএসএম অ্যাডভেঞ্চারের জন্য, আমি একবারে কোনও চলক (এএসএমের কয়েক হাজার লাইনের জন্য) র‌্যাম ব্যবহার করি নি। এএসএম সম্ভাব্য অভাবনীয়ভাবে সি ++ এর চেয়ে দ্রুততর হতে পারে। তবে এটি অনেকগুলি পরিবর্তনশীল কারণের উপর নির্ভর করে:

1. I was writing my apps to run on the bare metal.
2. I was writing my own boot loader that was starting my programs in ASM so there was no OS management in the middle.

আমি এখন সি # এবং সি ++ শিখছি কারণ আমি উত্পাদনশীলতার বিষয়টি বুঝতে পেরেছি !! আপনি নিখরচায় একা খাঁটি এএসএম ব্যবহার করে দ্রুততম কল্পনাযোগ্য প্রোগ্রাম করার চেষ্টা করতে পারেন। তবে কিছু উত্পাদন করতে কিছু উচ্চ স্তরের ভাষা ব্যবহার করুন।

উদাহরণস্বরূপ, আমি শেষবারের কোডটি কোড করেছিলাম জেএস এবং জিএলএসএল ব্যবহার করছিলাম এবং আমি কোনও পারফরম্যান্সের বিষয়টি লক্ষ্য করিনি, এমনকি জেএস সম্পর্কে কথা বলি যা ধীর। কারণ জিপিইউ-র 3 ডি প্রোগ্রামিংয়ের একমাত্র ধারণাটি সেই ভাষার গতি তৈরি করে যা জিপিইউতে আদেশগুলি প্রায় অপ্রাসঙ্গিকভাবে প্রেরণ করে।

খালি ধাতুতে একা এসেম্বলারের গতি অপরিবর্তনীয়। এটি কি সি ++ এর মধ্যে আরও ধীর হতে পারে? - এটি হতে পারে কারণ আপনি সংকলকটি দিয়ে শুরু করে কোনও এসেম্বলার ব্যবহার না করে সংবিধান কোড লিখছেন।

আমার ব্যক্তিগত কাউন্সিলটি হ'ল এসেম্বলি কোডটি কখনই এড়াতে না পারলে আমি তা লিখতে পারি না, যদিও আমি সমাবেশ পছন্দ করি।


1

এখানে সমস্ত উত্তর একটি দিক বাদ দেয় বলে মনে হয়: কখনও কখনও আমরা একটি নির্দিষ্ট লক্ষ্য অর্জনের জন্য কোড লিখি না, তবে এটি নিছক মজাদার জন্য। এটি করার জন্য সময় বিনিয়োগ করা অর্থনৈতিক হতে পারে না তবে তর্কযোগ্যভাবে ম্যানুয়ালি ঘূর্ণিত এএসএম বিকল্পের সাথে দ্রুততম সংকলক অপ্টিমাইজড কোড স্নিপেটকে পেটানোর চেয়ে বড় তৃপ্তি আর কিছু নেই।


আপনি যখন কেবল সংকলককে বীট করতে চান, সাধারণত আপনার ফাংশনের জন্য এর asm আউটপুট নেওয়া এবং আপনি যে টুইটটি করেন তা স্থায়ী একা asm ফাংশনে রূপান্তর করা সহজ। সি ++ এবং এএসএমের মধ্যে ইন্টারফেসটি সঠিকভাবে পেতে এবং এটি সর্বোত্তম কোডে সংকলন করছে কিনা তা খতিয়ে দেখার জন্য ইনলাইন asm ব্যবহার করা অতিরিক্ত কাজের একগুচ্ছ কাজ। (কিন্তু যখন কেবল মজার জন্য এরকম অন্তত, আপনি এটি নির্দিষ্ট-প্রসারণ মত অপ্টিমাইজেশন পরাজিত সম্পর্কে চিন্তা করতে হবে না তখন অন্য কিছু। মধ্যে ফাংশন inlines gcc.gnu.org/wiki/DontUseInlineAsm )।
পিটার কর্ডেস

আরও দেখুন Collatz-অনুমান সি ++ বনাম হাতে লেখা এ এস এম Q & A- কিভাবে কি সি সংশোধন করতে শিখতে ব্যবহার করার জন্য পরামর্শ মজা করার জন্য কম্পাইলার প্রহার :) আর সম্পর্কে আরো জানার জন্য ++, কম্পাইলার ভাল কর কোড সাহায্য করার জন্য।
পিটার কর্ডেস

@ পিটারকর্ডস তাই আপনি যা বলছেন তা আপনি সম্মত হন।
ম্যাডোকি

1
হ্যাঁ, asm মজাদার, এই চারপাশে খেলার জন্য এমনকি ইনলাইন asm সাধারণত ভুল পছন্দ except এটি প্রযুক্তিগতভাবে একটি ইনলাইন-এএসএম প্রশ্ন, সুতরাং আপনার উত্তরে কমপক্ষে এই পয়েন্টটি সম্বোধন করা ভাল হবে। এছাড়াও, এটি উত্তর চেয়ে একটি মন্তব্য সত্যিই বেশি।
পিটার কর্ডেস

ঠিক আছে, সম্মত হলাম. আমি একজন ছদ্মবেশী লোক ছিলাম তবে সেটাই ছিল আশির দশক।
ম্যাডোকি

-2

একটি সি ++ সংকলক, সাংগঠনিক পর্যায়ে অপ্টিমাইজেশনের পরে, কোড তৈরি করবে যা লক্ষ্যযুক্ত সিপিইউ-র অন্তর্নির্মিত কাজে ব্যবহার করবে। এইচএলএল বিভিন্ন কারণে কখনও অ্যাসেমব্লারকে ছাড়িয়ে যাবে না বা সম্পাদন করবে না; 1.) এইচএলএল সংকলন করা হবে এবং এক্সেসর কোড, সীমানা চেকিং এবং সম্ভবত আবশ্যক আবর্জনা সংগ্রহের মধ্যে নির্মিত (পূর্বে ওওপি পদ্ধতিতে সম্বোধনের সুযোগ) সমস্ত প্রয়োজনীয় চক্র (ফ্লিপ এবং ফ্লপ) দিয়ে আউটপুট করা হবে। এইচএলএল আজকাল একটি দুর্দান্ত কাজ করে (আরও নতুন সি ++ এবং জিওর মতো অন্যান্যগুলি সহ) তবে তারা যদি এসপিবলারকে (যেমন আপনার কোড) ছাড়িয়ে যায় তবে আপনাকে সিপিইউ ডকুমেন্টেশন-স্লোপি কোড সহ কম্পিউটারের সাথে পরামর্শ করা দরকার - অবশ্যই সংবিধানের মতো সমস্ত সমাধানের মতো অসঙ্গতি এবং সংকলিত ল্যাংগুলি are নীচে অপ-কোডে এইচএলএল বিশদগুলিকে বিমূর্ত করে এবং সেগুলি অপসারণ করে না অন্য কোনও অ্যাপ্লিকেশন এটি হোস্ট ওএস দ্বারা স্বীকৃত হয়ে উঠলে চলবে না।

বেশিরভাগ এসেম্বলারের কোড (প্রাথমিকভাবে অবজেক্টস) অন্যান্য নির্বাহযোগ্য ফর্ম্যাটে অন্তর্ভুক্তির জন্য "হেডলেস" হিসাবে আউটপুট হয় যার ফলে কম প্রসেসিং প্রয়োজন হয় তাই এটি আরও দ্রুততর হবে, তবে আরও বেশি সুরক্ষিত হবে না; যদি এক্সিকিউটেবলটি এসেম্বলারের (এনএএসএম, ওয়াইএএসএম; ইত্যাদি) দ্বারা আউটপুট হয় তবে এটি কার্যকরভাবে এইচএলএল কোডের সাথে পুরোপুরি না মেলে ততক্ষণে দ্রুত চলতে পারে তবে ফলাফলগুলি সঠিকভাবে ওজন করা যেতে পারে।

যে কোনও বিন্যাসে এইচএলএল থেকে একটি এসেম্বলার ভিত্তিক কোড অবজেক্ট কল করা সহজাতভাবে পরিবর্তনশীল / ধ্রুবক ডেটা ধরণের জন্য বিশ্বব্যাপী বরাদ্দ মেমরি ব্যবহার করে মেমরি স্পেস কলগুলির পাশাপাশি প্রসেসিং ওভারহেড যুক্ত করবে (এটি এলএলএল এবং এইচএলএল উভয় ক্ষেত্রেই প্রযোজ্য)। মনে রাখবেন যে চূড়ান্ত আউটপুট সিপিইউকে শেষ পর্যন্ত তার এপিআই এবং অ্যাবিআই হিসাবে হার্ডওয়্যার (অপকোড) এর সাথে সম্পর্কিত করে এবং এসেম্বলার্স এবং "এইচএলএল সংকলক" উভয়ই মূলত / মৌলিকভাবে একমাত্র সত্য ব্যতিক্রমের সাথে পাঠযোগ্যতা (ব্যাকরণগত) হিসাবে অভিন্ন।

হ্যালো ওয়ার্ল্ড কনসোল অ্যাপ্লিকেশনটি এসএসএএমএসএল এ এফএসএম ব্যবহার করে 1.5 কেবি (এবং এটি উইন্ডোতে ফ্রিবিএসডি এবং লিনাক্সের চেয়েও ছোট) এবং জিসিসি তার সেরা দিনটিতে যে কোনও কিছু ফেলতে পারে তাকে আউটপুটফর্ম করে; কারণগুলি হ'ল ন্যাপগুলির সাথে অন্তর্ভুক্ত প্যাডিং, অ্যাক্সেসের বৈধতা এবং কয়েকটি নাম সীমাবদ্ধ পরীক্ষা করা। আসল লক্ষ্য হ'ল ক্লিন এইচএলএল লিবস এবং একটি অপটিমাইজযোগ্য সংকলক যা একটি সিপিইউকে একটি "শক্তিশালী" উপায়ে লক্ষ্য করে এবং বেশিরভাগ দিন (শেষ পর্যন্ত) করে। জিসিসি ওয়াইএএসএম-এর চেয়ে ভাল নয় - এটি বিকাশকারীদের কোডিং অনুশীলন এবং বোঝা যা প্রশ্নে রয়েছে এবং "অপ্টিমাইজেশন" নবজাতক অনুসন্ধান এবং অন্তর্বর্তীকালীন প্রশিক্ষণ ও অভিজ্ঞতার পরে আসে।

সংকলকগণকে একই ডিসপোজার হিসাবে একই অপকোডে আউটপুট জন্য সংযুক্ত করতে হয় এবং সংযুক্ত করতে হয় কারণ সেই কোডগুলি সমস্ত সিপিইউ ব্যতীত (সিআইএসসি বা আরআইএসসি [পিআইসিও]) বাদে থাকে। YAsm অপ্টিমাইজড এবং প্রারম্ভিক NAsm উপর একটি দুর্দান্ত কাজ পরিষ্কার করে শেষ পর্যন্ত সেই এসেমব্লার থেকে সমস্ত আউটপুট গতি বাড়িয়ে তোলে, তবুও YAsm এখনও NAsm এর মত, বিকাশকারীর পক্ষে ওএস লাইব্রেরিগুলিকে লক্ষ্য করে বাহ্যিক নির্ভরতা সহ এক্সিকিউটেবল উত্পাদন করে তাই মাইলেজ ভিন্ন হতে পারে। সি ++ বন্ধ করে এমন এক পর্যায়ে যা অবিশ্বাস্য এবং বিশেষ করে বাণিজ্যিক খাতে ৮০+ শতাংশের জন্য এসেম্বলারের চেয়ে বেশি সুরক্ষিত ...


1
সি এবং সি ++ এর সীমাবদ্ধতা যাচাই করার প্রয়োজন নেই যদি না আপনি এটি জিজ্ঞাসা করেন এবং কোনও আবর্জনা সংগ্রহ না করেন যতক্ষণ না আপনি নিজে এটি প্রয়োগ করেন বা একটি লাইব্রেরি ব্যবহার করেন না। আসল প্রশ্নটি হ'ল সংকলকটি মানুষের চেয়ে আরও ভাল লুপগুলি তৈরি করে (এবং গ্লোবাল অপ্টিমাইজেশন)। সাধারণত হ্যাঁ, যদি না মানুষ সত্যিই জানে যে তারা কী করছে এবং এতে প্রচুর সময় ব্যয় করে
পিটার

1
আপনি NASM বা YASM (কোনও বাহ্যিক কোড নেই) ব্যবহার করে স্থির এক্সিকিউটেবল তৈরি করতে পারেন। এগুলি উভয় সমতল বাইনারি ফর্ম্যাটে আউটপুট করতে পারে, তাই আপনি যদি সত্যিই চালনা না করতে চান তবে নিজেকে সেগুলি ইএলএফ হেডারগুলি একত্রিত করতে পারতেন ld, তবে আপনি যদি ফাইলের আকারের জন্য অনুকূলভাবে চেষ্টা করার চেষ্টা না করেন তবে কোনও পার্থক্য নেই (কেবল আকারের আকার নয়) পাঠ্য বিভাগ)। লিনাক্সের জন্য সত্যিই টেনেসি ইএলএফ এক্সিকিউটেবল তৈরির বিষয়ে একটি ঘূর্ণি টিউটোরিয়াল দেখুন ।
পিটার কর্ডেস

1
সম্ভবত আপনি সি # এর কথা ভাবছেন, বা std::vectorডিবাগ মোডে সংকলিত। সি ++ অ্যারে এর মতো নয়। সংকলকগণ সংকলন সময়ে স্টাফ চেক করতে পারেন, তবে আপনি অতিরিক্ত কঠোরকরণের বিকল্পগুলি সক্ষম না করা পর্যন্ত রান-টাইম চেকিং নেই। উদাহরণস্বরূপ এমন একটি ফাংশন দেখুন যা আর্গের প্রথম 1024 উপাদানকে int array[]বাড়িয়ে তোলে। Asm আউটপুটটির কোনও রানটাইম চেক নেই: Godbolt.org/g/w1HF5t । এটি যা পায় তা হ'ল একটি পয়েন্টার rdi, কোনও আকারের তথ্য নয়। এটি 1024 এর চেয়ে কম অ্যারে দিয়ে কখনও কল না করে অপরিজ্ঞিত আচরণ এড়াতে প্রোগ্রামারটির উপর নির্ভর করে
পিটার

1
আপনি যা কিছু কথা বলছেন তা কোনও সরল সি ++ অ্যারে নয় (এর সাথে বরাদ্দ করুন new, ম্যানুয়ালি মুছে দিন delete, কোনও সীমা পরীক্ষা করা নেই)। আপনি shitty ফোলাযুক্ত asm / মেশিন-কোড উত্পাদন করার জন্য সি ++ ব্যবহার করতে পারেন (বেশিরভাগ সফ্টওয়্যারের মতো) তবে এটি প্রোগ্রামারটির দোষ, সি ++ এর নয়। এমনকি আপনি allocaঅ্যারে হিসাবে স্ট্যাক স্পেস বরাদ্দ করতেও ব্যবহার করতে পারেন ।
পিটার

1
একটি উদাহরণ লিঙ্ক করুন gcc.godbolt.org এর g++ -O3একটি প্লেইন অ্যারের জন্য সীমা-পরীক্ষণের কোড তৈরী, অথবা করছেন আর যাই হোক না কেন আপনার সম্পর্কে কথা বলছি। সি ++ প্রস্ফুটিত বাইনারিগুলি উত্পাদন করা আরও সহজ করে তোলে (এবং বাস্তবে আপনি যদি পারফরম্যান্সের জন্য লক্ষ্য রাখছেন তবে আপনাকে সতর্কতা অবলম্বন করতে হবে), তবে এটি আক্ষরিকভাবে অনিবার্য নয়। আপনি যদি বুঝতে পারেন যে সি ++ কীভাবে asm কে সংকলন করে, আপনি হাতে কোডটি লিখতে পারার চেয়ে কিছুটা খারাপের কোড পেতে পারেন তবে হাতের দ্বারা পরিচালিত করার চেয়ে আরও বড় স্কেলটিতে ইনলাইনিং এবং ধ্রুবক-প্রচার সহ।
পিটার

-3

আপনার সংকলক প্রচুর পরিমাণে ওও সমর্থন কোড জেনারেট করলে দ্রুত সমাবেশ হতে পারে ।

সম্পাদনা:

জনগণের কাছে: ওপি লিখেছিল "আমি কি ... সি ++ এর দিকে মনোনিবেশ করব এবং সমাবেশের ভাষাটি ভুলে যাব?" এবং আমি আমার উত্তর পাশে দাঁড়ানো। বিশেষত পদ্ধতিগুলি ব্যবহার করার সময় আপনাকে ও ও উত্পন্ন কোডটি সর্বদা লক্ষ্য রাখতে হবে। অ্যাসেম্বলি ভাষার কথা ভুলে যাওয়া না হওয়ার অর্থ আপনি আপনার ওও কোডটি উত্পন্ন সমাবেশটি পর্যায়ক্রমে পর্যালোচনা করবেন যা আমি বিশ্বাস করি যে ভাল পারফরম্যান্স সফ্টওয়্যার লেখার জন্য এটি আবশ্যক।

আসলে, এটি কেবল ওও নয়, সমস্ত সংকলনযোগ্য কোডের সাথে সম্পর্কিত।


2
-1: আমি কোনও ওও বৈশিষ্ট্য ব্যবহৃত হচ্ছে না। আপনার যুক্তিটি একই রকম "আপনার সংকলক যদি এক মিলিয়ন এনওপি যোগ করে তবে সমাবেশও দ্রুত হতে পারে faster"
সুজোরড

আমি অস্পষ্ট ছিলাম, এটি আসলে একটি সি প্রশ্ন। আপনি যদি সি ++ কম্পাইলারের জন্য সি কোড লিখেন তবে আপনি সি ++ কোড লিখছেন না এবং আপনি কোনও ওও স্টাফ পাবেন না। একবার আপনি রিয়েল সি ++ এ লেখা শুরু করার পরে, ওও স্টাফ ব্যবহার করে আপনাকে ওও সমর্থন কোড তৈরি না করার জন্য সংকলকটি পেতে খুব জ্ঞানবান হতে হবে।
অলিফ ফোর্শেল

সুতরাং আপনার উত্তর প্রশ্ন সম্পর্কে না? (এছাড়াও, ব্যাখ্যা উত্তরে যান, না মন্তব্যসমূহ মন্তব্য কোন নোটিশ, বিজ্ঞপ্তি, বা ইতিহাস মুছে ফেলা যাবে যে কোন
গরুর হাঁসের

1
ওও "সমর্থন কোড" বলতে আপনার অর্থ কী তা নিশ্চিত নন Not অবশ্যই, আপনি যদি প্রচুর আরটিটিআই এবং এর মতো ব্যবহার করেন তবে সংকলককে সেই বৈশিষ্ট্যগুলি সমর্থন করার জন্য প্রচুর অতিরিক্ত নির্দেশাবলী তৈরি করতে হবে - তবে আরটিটিআইয়ের অনুমোদনের জন্য পর্যাপ্ত উচ্চ-স্তরের কোনও সমস্যা সমাবেশে সম্ভাব্যভাবে লেখার মতো জটিলও নয় assembly । আপনি যা করতে পারেন তা হ'ল কেবল বিমূর্ততার বাইরের ইন্টারফেসটিকে ওও হিসাবে লিখুন, পারফরম্যান্স-অনুকূলিত বিশুদ্ধ প্রক্রিয়াজাত কোডে প্রেরণ যেখানে এটি গুরুত্বপূর্ণ। তবে, অ্যাপ্লিকেশনটির উপর নির্ভর করে, ভার্চুয়াল উত্তরাধিকার ছাড়াই সি, ফোর্টরান, সিইউডিএ বা কেবল সি ++ ভাল হতে পারে এখানে সমাবেশের চেয়ে ভাল।
বাম দিকের বাইরে

2
না। কমপক্ষে খুব সম্ভবত না। সি ++ তে একটি জিনিস রয়েছে যার নাম শূন্য ওভারহেড নিয়ম, এবং এটি বেশিরভাগ সময় প্রযোজ্য। ওও সম্পর্কে আরও জানুন - আপনি খুঁজে পাবেন যে শেষ পর্যন্ত এটি আপনার কোডের পাঠযোগ্যতা উন্নত করে, কোডের মান উন্নত করে, কোডিংয়ের গতি বাড়ায়, দৃ ,়তা বৃদ্ধি করে। এম্বেডের জন্যও - তবে এটি আপনাকে আরও নিয়ন্ত্রণ দেয় বলে সি ++ ব্যবহার করুন, এমবাডড + ওও জাভা উপায়টি আপনাকে ব্যয় করবে।
জেন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.