আধুনিক ওও ভাষাগুলি কি সি ++ এর অ্যারের স্টোর পারফরম্যান্সের সাথে প্রতিযোগিতা করতে পারে?


40

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

Object[] arr = new String[2];   // Java, C# and D allow this

কোভেরিয়েন্ট অ্যারেগুলি স্ট্যাটিক টাইপ সিস্টেমে একটি গর্ত। তারা টাইপ ত্রুটিগুলি সম্ভব করে তোলে যা সংকলন সময়ে সনাক্ত করা যায় না, সুতরাং অ্যারেতে লেখা প্রতিটি লেখার সময় রানটাইমের সময় পরীক্ষা করা উচিত:

arr[0] = "hello";        // ok
arr[1] = new Object();   // ArrayStoreException

এটি যদি আমি প্রচুর অ্যারে স্টোর করি তবে এটি একটি ভয়াবহ পারফরম্যান্সের মতো বলে মনে হচ্ছে।

সি ++ তে কোভারিয়েন্ট অ্যারে নেই, সুতরাং এই জাতীয় রানটাইম চেক করার দরকার নেই, যার অর্থ কোনও পারফরম্যান্স পেনাল্টি নেই।

রানটাইম চেকগুলির সংখ্যা কমাতে কোনও বিশ্লেষণ করা আছে কি? উদাহরণস্বরূপ, যদি আমি বলি:

arr[1] = arr[0];

যে কেউ তর্ক করতে পারে যে দোকানটি সম্ভবত ব্যর্থ হতে পারে না। আমি নিশ্চিত যে প্রচুর অন্যান্য সম্ভাব্য অপটিমাইজেশন রয়েছে যা আমি ভেবে দেখিনি।

আধুনিক সংকলকরা কি আসলে এই ধরণের অপ্টিমাইজেশানগুলি করেন বা আমার কি এই সত্যের সাথে বাঁচতে হবে, উদাহরণস্বরূপ, একটি কুইকোর্ট সর্বদা ও (এন লগ এন) অপ্রয়োজনীয় রানটাইম চেক করে?

আধুনিক ওও ভাষাগুলি সহ-বৈকল্পিক অ্যারেগুলিকে সমর্থন করে তৈরি করা ওভারহেড এড়াতে পারে?


7
আমি বিভ্রান্ত হয়ে পড়ছি আপনি কেন সি ++ টি সুপারিশ করছেন এমন বৈশিষ্ট্যটিতে অন্যান্য ভাষার চেয়ে দ্রুততর সি ++ এমনকি সমর্থন করে না।

17
@eco: অ্যারে অ্যাক্সেস সহ সি ++ দ্রুততর কারণ এটি সহ-বৈকল্পিক অ্যারেগুলিকে সমর্থন করে না। ফ্রেড জানতে চান যে "আধুনিক ওও ভাষাগুলি" -র সহ-বৈকল্পিক অ্যারেগুলির ওভারহেড এলিডি করা সি ++ গতির কাছাকাছি পৌঁছানো সম্ভব কিনা।
মাকিং হাঁস

13
"রান কোডটি সংকলন করে তবে ব্যতিক্রম ছুঁড়ে এমন কোডটি খারাপ সংবাদ"

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

7
@ জেসি আর আপনি কখন বাদে ব্যতিক্রম আশা করবেন? সমস্যাটি রানটাইমের সময় ব্যতিক্রম ছুঁড়ে এমন কোড নয় - এমন প্রচুর কেস রয়েছে যেখানে এটি ভাল বোঝায় - সমস্যাটি এমন কোড যা গ্যারান্টিযুক্ত যা গতিযুক্ত যা সংস্থাপক দ্বারা স্থিরভাবে ধরা পড়ে না তবে পরিবর্তে তার ব্যতিক্রম হতে পারে রানটাইম।
জোনাথন এম ডেভিস

উত্তর:


33

ডি নেই covariant অ্যারে আছে। এটি তাদের সাম্প্রতিক প্রকাশের আগে ( dmd 2.057 ) অনুমতি দিয়েছে, তবে সেই বাগটি ঠিক করা হয়েছে।

ডি-তে একটি অ্যারে কার্যকরভাবে পয়েন্টার এবং দৈর্ঘ্যের সাথে কেবল একটি কাঠামো:

struct A(T)
{
    T* ptr;
    size_t length;
}

কোনও অ্যারের সূচীকরণ করার সময় বাউন্ড চেকিং সাধারণত করা হয়, তবে আপনি যখন কম্পাইল করবেন তখন তা সরিয়ে ফেলা হবে -release। সুতরাং, রিলিজ মোডে, সি / সি ++ এর অ্যারে এবং ডি এর মধ্যে কোন পারফরম্যান্স পার্থক্য নেই


মনে হচ্ছে, না - d-programming-language.org/arrays.html বলে "একটি স্ট্যাটিক অ্যারে T[dim]পরোক্ষভাবে নিম্নলিখিত এক পরিবর্তিত করা যায়: ... U[]... একটি গতিশীল অ্যারের T[]পরোক্ষভাবে নিম্নলিখিত এক রূপান্তরিত করা যেতে পারে: U[]। .. যেখানে Uএকটি বেস ক্লাস T। "
বেন ভয়েগট

2
@ বেনভয়েগট তারপরে অনলাইন ডক্স আপডেট করা দরকার। দুর্ভাগ্যক্রমে এগুলি সর্বদা 100% আপ টু ডেট থাকে না। রূপান্তরটি এর সাথে কাজ করবে const U[], তারপরে আপনি অ্যারের উপাদানগুলিকে ভুল টাইপটি বরাদ্দ করতে পারবেন না, তবে T[]অবশ্যই পরিবর্তনযোগ্য হিসাবে রূপান্তর করবেন না । কোভেরিয়েন্ট অ্যারেগুলির মতো এর আগে অনুমতি দেওয়া হ'ল একটি গুরুতর ডিজাইনের ত্রুটি যা এখন সংশোধন করা হয়েছে। U[]U[]
জোনাথন এম ডেভিস

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

@ সুপের্যাট আপনি যদি এমন কোনও ফাংশন লিখতে চান যা স্বেচ্ছাসেবী প্রকারগুলি সাজায়, তবে এটিকে টেম্প্লেটিজ করুন। যেমন dlang.org/phobos/std_algorithm.html#sort
জোনাথন এম ডেভিস

21

হ্যাঁ, একটি গুরুত্বপূর্ণ অপটিমাইজেশন হ'ল:

sealed class Foo
{
}

সি # তে, এই শ্রেণিটি কোনও প্রকারের জন্য সুপার টাইপ হতে পারে না, তাই আপনি কোনও ধরণের অ্যারের জন্য চেক এড়াতে পারেন Foo

এবং দ্বিতীয় প্রশ্নে, এফ # সহ-বৈকল্পিক অ্যারেগুলিকে অনুমতি দেওয়া হয়নি (তবে আমি অনুমান করি যে রানটাইমের সময় অপ্টিমাইজেশনে অপ্রয়োজনীয়তা না পাওয়া পর্যন্ত চেকটি সিএলআরে থাকবে)

let a = [| "st" |]
let b : System.Object[] = a // Fails

https://stackoverflow.com/questions/7339013/array-covariance-in-f

কিছুটা সম্পর্কিত সমস্যা অ্যারে বাউন্ড-চেকিং। এটি সিএলআর-এ করা অপ্টিমাইজেশান সম্পর্কে আকর্ষণীয় (তবে পুরানো) পড়তে পারে (সমকালীনভাবে 1 স্থানও উল্লেখ করা হয়েছে): http://blogs.msdn.com/b/clrcodegeneration/archive/2009/08/13/array-bounds -check-বর্জন-ইন-clr.aspx


2
স্কালাও এই নির্মাণকে বাধা দেয়: val a = Array("st"); val b: Array[Any] = aঅবৈধ। (তবে Scala মধ্যে অ্যারে আছে ... বিশেষ জাদু ... অন্তর্নিহিত জেভিএম কারণে ব্যবহার।)
PST

13

জাভা উত্তর:

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

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

কিছু ওভারহেড? অবশ্যই, তবে আমি সন্দেহ করি আপনি এটি কখনই লক্ষ্য করবেন ..


আমার উত্তর সমর্থন করতে সাহায্য করতে, দয়া করে এই ডাঃ ক্লিফ দেখুন জাভা বনাম সি পারফরম্যান্স নিয়ে আলোচনা ব্লগপোস্ট ক্লিক করুন


10

ডি কোভেরিয়েন্ট অ্যারেগুলিকে অনুমতি দেয় না।

void main()
{
    class Foo {}
    Object[] a = new Foo[10];
}  

/* Error: cannot implicitly convert expression (new Foo[](10LU)) of type Foo[]
to Object[] */

আপনি যেমনটি বলেছেন, এটির অনুমতি দেওয়ার জন্য এটি টাইপ সিস্টেমে একটি গর্ত হবে।

ভুলের জন্য আপনাকে ক্ষমা করা যেতে পারে, কারণ 13 ই ডিসেম্বর প্রকাশিত সর্বশেষতম ডিএমডি-তে এই বাগটি কেবলমাত্র ঠিক করা হয়েছিল।

ডি তে অ্যারে অ্যাক্সেস সি বা সি ++ এর মতোই দ্রুত।


D-programming-language.org/arrays.html এর মতে "একটি স্ট্যাটিক অ্যারে টি [ ম্লান ] স্পষ্টভাবে নিম্নলিখিতগুলির মধ্যে একটিতে রূপান্তরিত হতে পারে: ... ইউ [] ... একটি গতিশীল অ্যারে টি [] স্পষ্টতই রূপান্তরিত হতে পারে নিম্নলিখিতগুলির একটিতে: ইউ [] ... যেখানে ইউ টি এর একটি বেস শ্রেণি ""
বেন ভয়েগট

1
@ বেনভয়েগ: পুরানো ডক্স।
বিসিএস

1
@ বেনভয়েগ: ডকুমেন্টেশন আপডেট করার জন্য আমি একটি টান অনুরোধ তৈরি করেছি। আশা করি শিগগিরই এর সমাধান হয়ে যাবে। এটা ইশারা জন্য ধন্যবাদ।
পিটার আলেকজান্ডার

5

পরীক্ষা থেকে আমি একটি সস্তা ল্যাপটপে করেছি, ব্যবহারের মধ্যে পার্থক্য int[]এবং Integer[]প্রায় 1.0 এনএস। প্রকারটির জন্য অতিরিক্ত চেকের কারণে পার্থক্য হতে পারে।

সাধারণত প্রতিটি এনএস না গণনা করা হয় তবে অবজেক্টগুলি কেবলমাত্র উচ্চ স্তরের যুক্তির জন্য ব্যবহৃত হয়। আপনার যদি প্রতিটি এনএস সঞ্চয় করতে হয় তবে আমি উচ্চ স্তরের অবজেক্টের মতো কনস্ট্রাক্ট ব্যবহার করা এড়াতে চাই। যে কোনও বাস্তব প্রোগ্রামে একাই অ্যাসাইনমেন্টগুলি খুব ছোট ফ্যাক্টর হতে পারে। যেমন একই মেশিনে একটি নতুন অবজেক্ট তৈরি করা হয় 5 এনএস।

কল করার জন্য কলগুলি অনেক বেশি ব্যয়বহুল হওয়ার সম্ভাবনা রয়েছে, আপনি যদি স্ট্রিংয়ের মতো কোনও জটিল বিষয় ব্যবহার করেন তবে sp


2

আপনি অন্যান্য আধুনিক ওও ভাষা সম্পর্কে জিজ্ঞাসা করেছেন? ওয়েল, ডেলফি stringকোনও সমস্যা না হয়ে আদিম হয়ে পুরোপুরি এই সমস্যাটি এড়িয়ে চলে । সুতরাং স্ট্রিংগুলির একটি অ্যারে হুবহু স্ট্রিংগুলির অ্যারে এবং অন্য কিছুই নয় এবং এগুলির উপর যে কোনও ক্রিয়াকলাপ নেটিভ কোড হিসাবে তত দ্রুত হয়, কোনও প্রকারের ওভারহেড চেক করে না।

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

অন্যান্য সামগ্রীর হিসাবে, সমস্যাটি বিদ্যমান নেই কারণ ডেল্ফিতে, সি ++ এর মতো, অ্যারেগুলি কোভারিয়েন্ট হয় না, যাতে এখানে বর্ণিত ধরণের সিস্টেমের ছিদ্রগুলি প্রতিরোধ করতে পারে।


1

বা আমার কি এই সত্যটি নিয়ে বাঁচতে হবে, উদাহরণস্বরূপ, একটি কুইকোর্ট সর্বদা ও (এন লগ এন) অপ্রয়োজনীয় রানটাইম চেক করে?

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

এই আচরণের কারণ হ'ল বাউন্ড চেকিং মেমরিতে কোডের প্রান্তিককরণকে পরিবর্তন করে, ক্যাশে হিট ইত্যাদির ফ্রিকোয়েন্সি সংশোধন করে etc.

সুতরাং হ্যাঁ, কুইকসোর্ট সর্বদা ও (এন লগ এন) উদ্দীপনা পরীক্ষা করে এবং প্রোফাইলে যাওয়ার পরে অনুকূলিত করে তোলে with


1

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

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.