সি # বনাম সি - বড় পারফরম্যান্সের পার্থক্য


94

আমি সি এনসি সি # তে একই কোডের মধ্যে বিশাল পারফরম্যান্সের পার্থক্য খুঁজে পাচ্ছি।

সি কোডটি হ'ল:

#include <stdio.h>
#include <time.h>
#include <math.h>

main()
{
    int i;
    double root;

    clock_t start = clock();
    for (i = 0 ; i <= 100000000; i++){
        root = sqrt(i);
    }
    printf("Time elapsed: %f\n", ((double)clock() - start) / CLOCKS_PER_SEC);   

}

এবং সি # (কনসোল অ্যাপ) হ'ল:

using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            DateTime startTime = DateTime.Now;
            double root;
            for (int i = 0; i <= 100000000; i++)
            {
                root = Math.Sqrt(i);
            }
            TimeSpan runTime = DateTime.Now - startTime;
            Console.WriteLine("Time elapsed: " + Convert.ToString(runTime.TotalMilliseconds/1000));
        }
    }
}

উপরের কোডটি সহ, সি # 0.328125 সেকেন্ডে (রিলিজ সংস্করণ) পূর্ণ করে এবং সি চালাতে 11.14 সেকেন্ড সময় নেয়।

সি মিংগ ব্যবহার করে এক্সিকিউটেবল একটি উইন্ডোতে সংকলিত হচ্ছে।

আমি সবসময় এই ধারণার অধীনে ছিলাম যে সি / সি ++ দ্রুত বা কমপক্ষে সি # নেট এর সাথে তুলনাযোগ্য ছিল। 30 বারের চেয়ে ধীরে ধীরে সিটি চালানোর কারণ কী?

সম্পাদনা: এটি প্রদর্শিত হচ্ছে যে সি # অপ্টিমাইজারটি ব্যবহার করা হচ্ছে না কারণ এটি রুটটি সরছিল। আমি রুট অ্যাসাইনমেন্টটি রুট + = এ পরিবর্তন করেছি এবং শেষে মোট ছাপিয়েছি। আমি সর্বাধিক গতির জন্য / O2 পতাকা সেট সহ cl.exe ব্যবহার করে সিও সংকলন করেছি।

ফলাফলগুলি এখন: সি # এর জন্য সি ২.61১ সেকেন্ডের জন্য ৩.75৫ সেকেন্ড

সি এখনও বেশি সময় নিচ্ছে, তবে এটি গ্রহণযোগ্য


19
আমি আপনাকে কেবল একটি ডেটটাইমের পরিবর্তে স্টপওয়াচ ব্যবহার করার পরামর্শ দেব।
অ্যালেক্স ফোর্ট

4
কোন সংকলক পতাকা? উভয়ই অপটিমাইজেশন সহ সংকলিত সক্ষম?
জলফ

4
আপনি যখন সি ++ কম্পাইলারের সাথে-ফাস্ট-ম্যাথ ব্যবহার করবেন তখন কী হবে?
ড্যান ম্যাকক্লেইন

10
কি আকর্ষণীয় প্রশ্ন!
রবার্ট এস

4
হয়তো সি স্কয়ার্ট ফাংশনটি সি # তে এর মতো ভাল নয়। তাহলে এটি সি-তে কোনও সমস্যা হবে না, তবে এটির সাথে লাইব্রেরি সংযুক্ত রয়েছে। গণিত ফাংশন ছাড়া কিছু গণনা চেষ্টা করুন।
ক্লিও করুন

উত্তর:


61

যেহেতু আপনি কখনই 'রুট' ব্যবহার করেন না, সংকলকটি আপনার পদ্ধতির অনুকূলকরণের জন্য কলটি সরিয়ে ফেলছে।

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

সম্পাদনা করুন: নীচে জলফের উত্তর দেখুন


4
সামান্য পরীক্ষা-নিরীক্ষার পরামর্শ দিচ্ছে যে এটি ঘটনা নয়। লুপটির কোড তৈরি করা হয়েছে, যদিও রানটাইম এড়িয়ে যাওয়ার পক্ষে যথেষ্ট স্মার্ট। এমনকি জমে থাকা, সি # এখনও সি এর প্যান্টকে মারধর করে
দানা

4
মনে হচ্ছে সমস্যাটি অন্য প্রান্তে রয়েছে। সি # সব ক্ষেত্রে যুক্তিযুক্ত আচরণ করে। তার সি কোডটি দৃশ্যত অপ্টিমাইজেশন ছাড়াই সংকলিত হয়েছে
জাল্ফ

4
আপনি অনেক এখানে পয়েন্ট অনুপস্থিত। আমি অনেকগুলি অনুরূপ কেস পড়ছি যেখানে সি # আউটফর্মস সি / সি ++ এবং সর্বদা প্রত্যাখাত হ'ল কিছু বিশেষজ্ঞের স্তর অপ্টিমাইজেশন নিয়োগ করা। 99% প্রোগ্রামারদের কেবল এই কোডটি সি # কোডের চেয়ে কিছুটা দ্রুত চালানোর জন্য এই জাতীয় অনুকূলকরণ কৌশলগুলি ব্যবহার করার জ্ঞান নেই। সি / সি ++ এর ক্ষেত্রে ব্যবহারের ক্ষেত্রে সংকীর্ণতা রয়েছে।

167

আপনি অবশ্যই ডিবাগ বিল্ডগুলির সাথে তুলনা করছেন। আমি কেবল আপনার সি কোডটি সংকলন করেছি এবং পেয়েছি

Time elapsed: 0.000000

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

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

যাইহোক, আপনি যদি একে অপরের চেয়ে ভাষার "দ্রুত" হওয়ার কোনও ধারণা পরিত্যাগ করেন তবে আপনি দীর্ঘকাল নিজেকে অনেকটা মাথাব্যাথা বাঁচাতে পারবেন। সি # এর আর ইংলিশের মতো গতি নেই।

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

সম্পাদনের গতি দ্বারা নির্ধারিত হয়:

  • আপনি যে প্ল্যাটফর্মটি চালাচ্ছেন (ওএস, হার্ডওয়্যার, সিস্টেমে চলছে অন্যান্য সফ্টওয়্যার)
  • সংকলক
  • আপনার উত্স কোড

একটি ভাল সি # সংকলক কার্যকর কোড পাবেন। একটি খারাপ সি সংকলক ধীর কোড উত্পন্ন করবে। একটি সি সংকলক সম্পর্কে কী যা সি # কোড উত্পন্ন করে, যা আপনি তখন একটি সি # সংকলকটির মাধ্যমে চালাতে পারবেন? কত দ্রুত চলবে? ভাষার গতি নেই। আপনার কোড না।


এখানে আরও অনেক আকর্ষণীয় পড়া: ব্লগস.এমএসএনএন
ড্যানিয়েল আর্উইকার ২er

18
ভাল উত্তর, তবে আমি কমপক্ষে উপমা অনুসারে ভাষার গতি সম্পর্কে একমত নই: লম্বা স্বরবৃত্তির উচ্চ ফ্রিকোয়েন্সি থাকার কারণে ওয়েলশ বেশিরভাগের চেয়ে ধীর ভাষা বলে প্রমাণিত হয়েছে। অতিরিক্তভাবে, লোকেরা শব্দগুলি (এবং শব্দের তালিকাগুলি) আরও ভাল মনে রাখে যদি তারা আরও দ্রুত বলে। web.missouri.edu/~cowann/docs/articles/before%201993/... en.wikipedia.org/wiki/Vowel_length en.wikipedia.org/wiki/Welsh_language
exceptionerror

4
আপনি ওয়েলশকে যা বলছেন তার উপর এটি নির্ভর করে না ? আমি অসম্ভব বলে মনে করি যে সবকিছু ধীর হয় is
জলফ

5
++ ওহে ছেলেরা, এখানে আলাদা হয়ে যান না। যদি একই প্রোগ্রামটি অন্য ভাষার তুলনায় একটি ভাষায় দ্রুত চালিত হয়, কারণ এটি বিভিন্ন সমাবেশ কোড উত্পন্ন করে। এই বিশেষ উদাহরণে, 99% সময় বা তার বেশি ভাসমান মধ্যে যেতে হবে i, এবং sqrt, যাতে এটা কি মাপা হচ্ছে।
মাইক ডুনলাভে

116

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

নেটিভ সি / সি ++ বছরের পিছনের সামঞ্জস্যের সাথে স্যাডেল করা হয়। / এফপি: সুনির্দিষ্ট, / এফপি: দ্রুত এবং / এফপি: কঠোর সংকলন বিকল্পগুলি সর্বাধিক দৃশ্যমান। তদনুসারে, এটি অবশ্যই একটি সিআরটি ফাংশন কল করবে যা স্কয়ার্ট () প্রয়োগ করে এবং ফলাফলটি সামঞ্জস্য করতে নির্বাচিত ভাসমান পয়েন্ট বিকল্পগুলি পরীক্ষা করে। এটা ধীর।


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

17
এনজেন.এক্স.ই.এস. সহ প্রি-জিটিংয়ের সমাধান এটি। আমরা জাভা নয়, সি # এর কথা বলছি।
হ্যান্স প্যাস্যান্ট

21
@ ইউজার ৮7373৩৯২ - সত্যি? কি দারুন.
আন্দ্রেস জোল্টান

8
না, এক্স 64 জিটারটি এসএসই ব্যবহার করে। ম্যাথ.এসকিআরটি () স্কয়ার্টসডি মেশিন কোড নির্দেশে অনুবাদিত হয়।
হ্যানস প্যাস্যান্ট

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

57

আমি একজন সি ++ এবং একটি সি # বিকাশকারী। .NET ফ্রেমওয়ার্কের প্রথম বিটা থেকে আমি সি # অ্যাপ্লিকেশনগুলি বিকাশ করেছি এবং আমার সি ++ অ্যাপ্লিকেশনগুলি বিকাশে 20 বছরেরও বেশি অভিজ্ঞতা অর্জন করেছি। প্রথমত, সি # কোডটি সি ++ অ্যাপ্লিকেশনটির চেয়ে দ্রুততর হবে না তবে আমি পরিচালিত কোড, এটি কীভাবে কাজ করে, আন্তঃ অপ-স্তর স্তর, মেমরি পরিচালন ইন্টার্নালস, গতিশীল টাইপ সিস্টেম এবং আবর্জনা সংগ্রহকারী সম্পর্কে দীর্ঘ আলোচনা করতে যাব না। তবুও, আমাকে এখানে তালিকাভুক্ত মানদণ্ডগুলি বলে সমস্তগুলি প্রকৃত ফলাফল দেয় continue

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

এর অর্থ হ'ল আপনি যদি রিলিজ বিল্ড (ডিইবিইউজি বিল্ড নয়) এর জন্য সঠিক প্যারামিটার ব্যবহার করে আপনার সি ++ অ্যাপ্লিকেশনটি সংকলন না করেন তবে আপনার সি ++ অ্যাপ্লিকেশন সংশ্লিষ্ট সি # বা .নেট ভিত্তিক অ্যাপ্লিকেশনটির চেয়ে আরও ধীরে ধীরে পারফর্ম করতে পারে। আপনার সি ++ অ্যাপ্লিকেশনটিতে প্রজেক্টের বৈশিষ্ট্য নির্দিষ্ট করার সময়, আপনি "সম্পূর্ণ অপ্টিমাইজেশন" এবং "ফাস্ট কোডের পক্ষে" সক্ষম করেছেন তা নিশ্চিত করুন। আপনার যদি একটি bit৪ বিট মেশিন থাকে তবে আপনার অবশ্যই লক্ষ্য প্ল্যাটফর্ম হিসাবে x64 উত্পন্ন করার জন্য নির্দিষ্ট করতে হবে, অন্যথায় আপনার কোডটি রূপান্তর উপ-স্তর (WW64) এর মাধ্যমে কার্যকর করা হবে যা কার্যকারিতা হ্রাস করবে which

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

এখন আমরা যদি ইন্টেল সংকলক ব্যবহার করি (যা এমডি / ইনটেল প্রসেসরের উচ্চ পারফরম্যান্স অ্যাপ্লিকেশন তৈরির জন্য একটি শিল্প গোপন), একই কোডটি সি ++ এক্সিকিউটেবল বনাম .72 সেকেন্ডের জন্য মাইক্রোসফ্ট ভিজ্যুয়াল স্টুডিও 2010 ব্যবহার করে .54 সেকেন্ডে কার্যকর করে । সুতরাং শেষ অবধি, চূড়ান্ত ফলাফলগুলি সি ++ এর জন্য .54 সেকেন্ড এবং সি # এর জন্য 1.16 সেকেন্ড। সুতরাং। নেট জেআইটি সংকলক দ্বারা উত্পাদিত কোডটি সি ++ এক্সিকিউটেবলের চেয়ে 214% গুণ বেশি সময় নেয়। .৪৪ সেকেন্ডে ব্যয় করা বেশিরভাগ সময় ছিল সিস্টেম থেকে সময় পাওয়ার ক্ষেত্রে এবং লুপের মধ্যেই ছিল না!

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

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

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


23
১. মাইক্রোসফ্ট সি # সম্পর্কে এই দাবীগুলি কখনই দ্রুত করেনি তাদের দাবিগুলি তার গতির প্রায় 90% গতিবেগ, দ্রুত বিকাশমান (এবং তাই টিউন করার জন্য আরও বেশি সময়) এবং মেমরি এবং টাইপ সুরক্ষার কারণে আরও বাগ বিনামূল্যে মুক্ত করে না। এর সবগুলিই সত্য (আমার কাছে সি ++ তে 20 বছর এবং সি # তে 10 বছর রয়েছে) ২. বেশিরভাগ ক্ষেত্রে স্টার্টআপ পারফরম্যান্স অর্থহীন। ৩. এলএলভিএম এর মতো দ্রুত সি # সংকলকও রয়েছে (সুতরাং ইনটেল আনা আপেলগুলিতে অ্যাপল নয়)
বেন

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

8
মাইক্রোসফ্ট আগের বিপণন সামগ্রীতে দ্রুতগতিতে নেট নেট এর কার্যকারিতা সম্পর্কে দাবি করেছিল। তারা আবর্জনা সংগ্রহকারী সম্পর্কে বিভিন্ন দাবিও করেছে পারফরম্যান্সের উপর খুব কম বা প্রভাব ফেলেনি। এর মধ্যে কয়েকটি দাবি এটিকে পূর্ববর্তী সংস্করণগুলিতে (এএসপি.এনইটি এবং। নেট) উপর তৈরি করেছে। যদিও মাইক্রোসফ্ট বিশেষভাবে আপনার সি # অ্যাপ্লিকেশনটি আপনার সি ++ অ্যাপ্লিকেশনের চেয়ে দ্রুততর বলে না, তারা জাস্টিক মন্তব্য এবং বিপণন স্লোগানগুলি যেমন "জাস্ট-ইন-টাইম মানে রান-ইট-ফাস্ট" ( এমএসডিএন.মাইক্রোসফটকম / এর মতো দ্রুত প্রচার করতে পারে) করতে পারে Although এন-ইউএস / লাইব্রেরি / এমএস 973894.aspx )।
রিচার্ড

72
-1, এই অভিঘাতটি ভুল এবং বিভ্রান্তিমূলক বক্তব্য যেমন পূর্ণ স্পষ্টভাবে "C # কোড কোনও সি ++ অ্যাপ্লিকেশনটির চেয়ে বেশি দ্রুততর হবে না" পূর্ণ
বিসিওয়েটস

33
-1। আপনার রিকো মারিয়ানি বনাম রেমন্ড চেনের সি # বনাম সি পারফরম্যান্স যুদ্ধটি পড়তে হবে: পড়তে হবে ব্লগস.এমএসএনএন বি ক্রিক আর্কাইভ 2005 05 16 418051 . aspx । সংক্ষেপে: এটি মাইক্রোসফ্টের অন্যতম স্মার্ট মাইক্রোসফ্টকে সি সি সংস্করণটিকে সাধারণ সি # সংস্করণের চেয়ে দ্রুততর করার জন্য প্রচুর অনুকূলিতকরণ করেছে।
রোল্ফ বর্জন কেভিনেগ

10

আমার প্রথম অনুমানটি একটি সংকলক অপ্টিমাইজেশন কারণ আপনি কখনই রুট ব্যবহার করেন না। আপনি কেবল এটি বরাদ্দ করেন, তারপরে এটিকে বারবার ওভাররাইট করুন।

সম্পাদনা: অভিশাপ, 9 সেকেন্ড দ্বারা পরাজিত!


4
আমি বলি আপনি ঠিক বলেছেন। আসল পরিবর্তনশীল ওভাররাইট করা হয় এবং এর বাইরে কখনও ব্যবহৃত হয় না। সিসিএস সম্ভবত পুরো লুপটি ত্যাগ করবে যখন সি ++ সংকলক সম্ভবত এটি রেখে গিয়েছিল A আরও সঠিক পরীক্ষাটি ফলাফল সংগ্রহ করা এবং তারপরে ফলাফলটি প্রিন্ট করা শেষে করা উচিত। এছাড়াও একটিতে বীজের মানটিকে হার্ড কোড করা উচিত নয়, বরং এটি ব্যবহারকারী-সংজ্ঞায়িত হিসাবে ছেড়ে দেওয়া উচিত। এটি সি # সংকলককে স্টাফ ছেড়ে দেওয়ার জন্য কোনও ঘর দেবে না।

7

লুপটি দূরে অপ্টিমাইজ করা হচ্ছে কিনা তা দেখতে, আপনার কোডটি এতে পরিবর্তন করার চেষ্টা করুন

root += Math.Sqrt(i);

উত্তর সি কোডে একইভাবে, এবং তারপরে লুপের বাইরে মূলের মুদ্রণ করুন।


6

হয়তো সি # সংকলকটি লক্ষ্য করছে যে আপনি কোথাও রুট ব্যবহার করবেন না, তাই এটি লুপের জন্য পুরোটা এড়িয়ে যায়। :)

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

সম্পাদনা: আমার মনে হয় না যে সংকলকটি লুপের জন্য কেবলমাত্র অনুকূলিত করতে পারে, কারণ এটি জানতে হবে যে ম্যাথ.সেক্র্ট () এর কোনও পার্শ্ব-প্রতিক্রিয়া নেই।


4
সম্ভবত এটি জানেন না।

4
@ নীল, @ জেফ: সম্মত, এটি এটি খুব সহজেই জানতে পারত। বাস্তবায়নের উপর নির্ভর করে, ম্যাথ.স্কয়ার্ট () -এর স্থির বিশ্লেষণ এতটা কঠিন নাও হতে পারে, তবে আমি নিশ্চিত নই যে কোনটি বিশেষভাবে অনুকূলিত হয়েছে performed
জন Feminella

5

সময় বিভিন্ন হোক না কেন। হতে পারে, সেই "অতিবাহিত সময়" অবৈধ। এটি কেবলমাত্র একটি বৈধ হবে যদি আপনি গ্যারান্টি দিতে পারেন যে উভয় প্রোগ্রামই একই শর্তে চলে।

হতে পারে আপনার একটি জয়ের চেষ্টা করা উচিত। equivalent / usr / বিন / সময় my_cprog এর সমতুল্য; / usr / বিন / সময় my_csprog


4
কেন এই নিম্নমানের? কেউ কি ধরে নিচ্ছে যে বাধা এবং প্রসঙ্গের সুইচগুলি কার্যকারিতা প্রভাবিত করে না? কেউ কি টিএলবি মিস, পৃষ্ঠা অদলবদল ইত্যাদি সম্পর্কে অনুমান করতে পারেন?
টম

5

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

সি কোড:

#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include <math.h>

void main()
{
    int count = (int)1e8;
    int subcount = 1000;
    double* roots = (double*)malloc(sizeof(double) * subcount);
    clock_t start = clock();
    for (int i = 0 ; i < count; i++)
    {
        roots[i % subcount] = sqrt((double)i);
    }
    clock_t end = clock();
    double length = ((double)end - start) / CLOCKS_PER_SEC;
    printf("Time elapsed: %f\n", length);
}

সি # তে:

using System;

namespace CsPerfTest
{
    class Program
    {
        static void Main(string[] args)
        {
            int count = (int)1e8;
            int subcount = 1000;
            double[] roots = new double[subcount];
            DateTime startTime = DateTime.Now;
            for (int i = 0; i < count; i++)
            {
                roots[i % subcount] = Math.Sqrt(i);
            }
            TimeSpan runTime = DateTime.Now - startTime;
            Console.WriteLine("Time elapsed: " + Convert.ToString(runTime.TotalMilliseconds / 1000));
        }
    }
}

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

আমার কম্পিউটারে সি # প্রোগ্রামটি 6.2 থেকে 6.9 সেকেন্ডের মধ্যে পরিবর্তিত হয়, অন্যদিকে সি সংস্করণটি 6.9 এবং 7.1 এর মধ্যে পরিবর্তিত হয়।


5

স্কয়ার-রুট রুটিনের সাথে পদক্ষেপ সহ আপনি যদি সমাবেশের স্তরে কোডটি একক পদক্ষেপে করেন তবে আপনি সম্ভবত আপনার প্রশ্নের উত্তর পাবেন get

শিক্ষিত অনুমান করার দরকার নেই।


আমি এটি কীভাবে করব তা জানতে চাই
জোশ স্টোডোলা ২

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

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

এফওয়াইআই: আমার জন্য এটি ভিসি ++ fadd এবং fsqrt ব্যবহার করে দেখিয়েছে যেখানে সি # ব্যবহার করা সিভিটিএসআই 2 এসডি এবং স্ক্রার্টসড যা আমি বুঝতে পেরেছি এসএসই 2 নির্দেশাবলী এবং যেখানে যথেষ্ট সমর্থনযোগ্য সেখানে যথেষ্ট দ্রুত।
ড্যানিও

2

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


তত্ত্বগতভাবে, হ্যাঁ অনুশীলনে, এটি কার্যত কোনও পরিমাপযোগ্য পার্থক্য করে না। এক ভাগ বা দুই, সম্ভবত, আপনি ভাগ্যবান যদি।
জাল্ফ

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

1

এটি আমার কাছে মনে হবে যে এটি ভাষাগুলির সাথে নিজেদের করার কিছুই নয়, বরং এটি বর্গমূলের ফাংশনের বিভিন্ন বাস্তবায়নের সাথে করা।


আমি অত্যন্ত সন্দেহ করি যে পৃথক পৃথক স্কয়ার্ট বাস্তবায়ন যে এত বৈষম্য ঘটায়।
অ্যালেক্স ফোর্ট

বিশেষত যেহেতু, এমনকি সি # তেও, বেশিরভাগ গণিতের ক্রিয়াকলাপগুলি এখনও পারফরম্যান্সকে সমালোচিত বলে বিবেচনা করা হয় এবং এটি কার্যকর করা হয়।
ম্যাথু ওলানিক

fsqrt একটি IA-32 প্রসেসরের নির্দেশনা, তাই আজকাল ভাষা প্রয়োগ অপ্রাসঙ্গিক।
নিশ্চিত নয়

ডিবাগার দিয়ে এমএসভিসির স্কয়ার্ট ফাংশনে পদক্ষেপ। এটি কেবল fsqrt নির্দেশনা কার্যকর করার চেয়ে আরও অনেক কিছু করছে।
bk1e

1

আসলে ছেলেরা, লুপটি অপ্টিমাইজ করা হচ্ছে না। আমি জনসের কোডটি সংকলন করেছি এবং ফলাফলটি পরীক্ষা করেছি e লুপের সাহসগুলি নিম্নরূপ:

 IL_0005:  stloc.0
 IL_0006:  ldc.i4.0
 IL_0007:  stloc.1
 IL_0008:  br.s       IL_0016
 IL_000a:  ldloc.1
 IL_000b:  conv.r8
 IL_000c:  call       float64 [mscorlib]System.Math::Sqrt(float64)
 IL_0011:  pop
 IL_0012:  ldloc.1
 IL_0013:  ldc.i4.1
 IL_0014:  add
 IL_0015:  stloc.1
 IL_0016:  ldloc.1
 IL_0017:  ldc.i4     0x5f5e100
 IL_001c:  ble.s      IL_000a

রানটাইমটি যথেষ্ট স্মার্ট না হলে লুপটি কিছুই করতে পারে না এবং এড়িয়ে যায়?

সম্পাদনা করুন: সি # তে পরিবর্তন করা হচ্ছে:

 static void Main(string[] args)
 {
      DateTime startTime = DateTime.Now;
      double root = 0.0;
      for (int i = 0; i <= 100000000; i++)
      {
           root += Math.Sqrt(i);
      }
      System.Console.WriteLine(root);
      TimeSpan runTime = DateTime.Now - startTime;
      Console.WriteLine("Time elapsed: " +
          Convert.ToString(runTime.TotalMilliseconds / 1000));
 }

সময় অতিবাহিত হয়েছে (আমার মেশিনে) 0.047 থেকে 2.17 এ চলে গেছে। কিন্তু এটি কি কেবলমাত্র 100 মিলিয়ন সংযোজন অপারেটর যুক্ত করার ওভারহেড?


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

এটাই আমি ভেবেছিলাম কেস হতে পারে। এমনকি এটি কাজ করতে বাধ্য করছে, যদিও এটি সি সংস্করণের চেয়ে 9 সেকেন্ড দ্রুত faster (আমি এটি মোটেই আশা করিনি)
দানা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.