উত্তরটি কি কেউ জানেন এবং / অথবা এ সম্পর্কে কোনও মতামত আছে?
যেহেতু টিপলগুলি সাধারণত খুব বড় না হয়, তাই আমি ধরে নেব এটিগুলির জন্য ক্লাসগুলির চেয়ে স্ট্রাক্ট ব্যবহার করা আরও বোধগম্য হবে। তুমি কি বল?
উত্তরটি কি কেউ জানেন এবং / অথবা এ সম্পর্কে কোনও মতামত আছে?
যেহেতু টিপলগুলি সাধারণত খুব বড় না হয়, তাই আমি ধরে নেব এটিগুলির জন্য ক্লাসগুলির চেয়ে স্ট্রাক্ট ব্যবহার করা আরও বোধগম্য হবে। তুমি কি বল?
উত্তর:
মাইক্রোসফ্ট সরলতার স্বার্থে সমস্ত tuple প্রকারের রেফারেন্স প্রকার তৈরি করেছে।
আমি ব্যক্তিগতভাবে মনে করি এটি একটি ভুল ছিল। 4 টিরও বেশি ক্ষেত্রের টিউপসগুলি খুব অস্বাভাবিক এবং যে কোনও উপায়ে আরও বেশি টাইপযুক্ত বিকল্পের সাথে প্রতিস্থাপন করা উচিত (যেমন F # তে রেকর্ড টাইপ) তাই কেবলমাত্র ছোট্ট টিপলগুলি ব্যবহারিক আগ্রহের বিষয়। আমার নিজস্ব মানদণ্ডগুলি দেখিয়েছে যে 512 বাইট অবধি আনবক্সবিহীন টিপলগুলি এখনও বাক্সযুক্ত টিউপলগুলির চেয়ে দ্রুত হতে পারে।
যদিও মেমরির দক্ষতা একটি উদ্বেগের বিষয়, তবে আমি বিশ্বাস করি যে প্রভাবশালী ইস্যুটি। নেট জঞ্জাল সংগ্রহকারীর ওভারহেড। .NET- এ বরাদ্দ এবং সংগ্রহ খুব ব্যয়বহুল কারণ এর আবর্জনা সংগ্রহকারী খুব বেশি ভারী অনুকূলিত হয়নি (যেমন জেভিএমের তুলনায়)। তদুপরি, ডিফল্ট .NET জিসি (ওয়ার্কস্টেশন) এখনও সমান্তরাল করা যায় নি। ফলস্বরূপ, সমান্তরাল প্রোগ্রামগুলি যা টুপলস ব্যবহার করে একটি স্থবির হয়ে যায় কারণ সমস্ত কোর ভাগ করে নেওয়া আবর্জনা সংগ্রহকারীর পক্ষে লড়াই করে, স্কেলিবিলিটি নষ্ট করে। এটি কেবল প্রভাবশালী উদ্বেগই নয়, তারা এই সমস্যাটি পরীক্ষা করার সময় মাইক্রোসফ্ট দ্বারা এএফআইকে সম্পূর্ণ অবহেলা করেছিল।
আর একটি উদ্বেগ ভার্চুয়াল প্রেরণ। রেফারেন্সের ধরণগুলি সাব টাইপগুলি সমর্থন করে এবং তাই তাদের সদস্যদের সাধারণত ভার্চুয়াল প্রেরণের মাধ্যমে আহ্বান জানানো হয়। বিপরীতে, মান ধরণেরগুলি সাব টাইপগুলিকে সমর্থন করতে পারে না তাই সদস্যের আহবান সম্পূর্ণ অস্পষ্ট এবং সর্বদা সরাসরি ফাংশন কল হিসাবে সম্পাদন করা যায়। ভার্চুয়াল প্রেরণা আধুনিক হার্ডওয়্যারটিতে অত্যন্ত ব্যয়বহুল কারণ সিপিইউ অনুমান করতে পারে না কোথায় প্রোগ্রামের কাউন্টারটি শেষ হবে end ভার্চুয়াল প্রেরণকে অনুকূলিত করতে জেভিএম দুর্দান্ত দৈর্ঘ্যে চলেছে কিন্তু। নেট তা দেয় না। যাইহোক, .NET মান ধরণের আকারে ভার্চুয়াল প্রেরণ থেকে একটি পলায়ন সরবরাহ করে। সুতরাং টিউপসকে মান ধরণের হিসাবে উপস্থাপন করা আবার নাটকীয়ভাবে পারফরম্যান্সের উন্নতি করতে পারে। উদাহরণস্বরূপ, কল করাGetHashCode
একটি 2-টিপল মিলিয়ন বার 0.17s সময় লাগে কিন্তু এটি একটি সমতুল স্ট্রাক্ট এ কল করতে কেবল 0.008s লাগে, অর্থাত্ মান প্রকারটি রেফারেন্স ধরণের চেয়ে 20 × দ্রুত।
একটি বাস্তব পরিস্থিতি যেখানে সাধারণত টিউপলগুলির সাথে এই পারফরম্যান্স সমস্যা দেখা দেয় তা হল অভিধানে কী হিসাবে টিপলস ব্যবহার করা। আমি স্ট্যাক ওভারফ্লো প্রশ্ন এফ # এর একটি লিঙ্ক অনুসরণ করে এই থ্রেডটিতে হোঁচট খেয়েছি, পি # আমার অ্যালগরিদমটি পাইথনের চেয়ে ধীরে ধীরে চালায়! যেখানে লেখকের এফ # প্রোগ্রামটি তার পাইথনের তুলনায় ধীরে ধীরে পরিণত হয়েছিল কারণ তিনি বক্সযুক্ত টিউপস ব্যবহার করছেন। হাতে লিখিত struct
টাইপ ব্যবহার করে ম্যানুয়ালি আনবক্সিং করা তার এফ # প্রোগ্রামটিকে কয়েকগুণ দ্রুত এবং পাইথনের চেয়ে দ্রুততর করে তোলে। এই বিষয়গুলি কখনই উত্থাপিত হত না যদি টিপলগুলি মান ধরণের দ্বারা প্রতিনিধিত্ব করা হত এবং রেফারেন্স ধরণের দ্বারা শুরু করা হত না ...
Tuple<_,...,_>
প্রকারগুলি সিল করা যেতে পারে , সেক্ষেত্রে রেফারেন্স ধরণের হয়েও ভার্চুয়াল প্রেরণের দরকার পড়েনি। তারা কেন রেফারেন্স টাইপ হয় তার চেয়ে কেন তাদের সিল দেওয়া হয় না সে সম্পর্কে আমি আরও কৌতূহলী।
কারণটি সম্ভবত সবচেয়ে বেশি কারণ কেবল ছোট টিপলগুলি মান ধরণের হিসাবে বিবেচনা করবে কারণ তাদের একটি ছোট মেমরির পদচিহ্ন থাকবে। বৃহত্তর টিপলস (অর্থাত্ আরও বেশি সম্পত্তিযুক্ত) কার্য সম্পাদনে ক্ষতিগ্রস্থ হবে কারণ তারা 16 বাইটের চেয়ে বড় হবে।
কিছু টিপলগুলি মান ধরণের হতে পারে এবং অন্যগুলি রেফারেন্সের ধরণ এবং বিকাশকারীদের তা জানার জন্য বাধ্য করুন যা আমি মাইক্রোসফ্টের লোকেরা তাদের সমস্ত রেফারেন্স প্রকারগুলি সহজ করে তৈরি করা ভেবেছিলাম imagine
আহ, সন্দেহের বিষয়টি নিশ্চিত! দয়া করে দেখুন বিল্ডিং Tuple :
প্রথম বড় সিদ্ধান্তটি ছিল টিউপলগুলিকে রেফারেন্স বা মান ধরণের হিসাবে বিবেচনা করা উচিত। যেহেতু আপনি টিউপলের মান পরিবর্তন করতে চাইলে এগুলি অপরিবর্তনীয়, তাই আপনাকে একটি নতুন তৈরি করতে হবে। যদি সেগুলি রেফারেন্সের ধরণের হয় তবে এর অর্থ হ'ল আপনি যদি টাইট লুপে টিপলে উপাদান পরিবর্তন করছেন তবে প্রচুর আবর্জনা তৈরি হতে পারে। এফ # টিউপলগুলি রেফারেন্সের ধরণ ছিল, তবে দলের পক্ষ থেকে একটি অনুভূতি ছিল যে তারা যদি পারফরম্যান্সের উন্নতি বুঝতে পারে তবে দুটি, এবং সম্ভবত তিনটি, এলিমেন্ট টিপলগুলি পরিবর্তে মান ধরণের ছিল। কিছু দল যা অভ্যন্তরীণ টুপলস তৈরি করেছিল তারা রেফারেন্স প্রকারের পরিবর্তে মান ব্যবহার করেছিল, কারণ তাদের পরিস্থিতি প্রচুর পরিচালিত অবজেক্ট তৈরি করতে খুব সংবেদনশীল ছিল। তারা দেখতে পেল যে কোনও মান ধরণের ব্যবহার তাদের আরও ভাল কর্মক্ষমতা দেয়। আমাদের টিউপল স্পেসিফিকেশনের প্রথম খসড়াতে, আমরা দুটি-, তিন- এবং চার-উপাদানের টিপলগুলিকে মানের ধরণ হিসাবে রেখেছি, বাকিটি রেফারেন্স ধরণের। তবে, অন্যান্য ভাষার প্রতিনিধিদের অন্তর্ভুক্ত একটি নকশাকরণের বৈঠকের সময় সিদ্ধান্ত নেওয়া হয়েছিল যে এই "বিভক্ত" নকশাটি বিভ্রান্তিকর হবে, কারণ দুটি ধরণের মধ্যে সামান্য পৃথক শব্দার্থকতা রয়েছে। আচরণ এবং ডিজাইনে ধারাবাহিকতা সম্ভাব্য পারফরম্যান্স বৃদ্ধির চেয়ে বেশি অগ্রাধিকারের জন্য নির্ধারিত হয়েছিল। এই ইনপুটটির উপর ভিত্তি করে, আমরা নকশাটি পরিবর্তন করেছি যাতে সমস্ত টিপলগুলি রেফারেন্স ধরণের হয়, যদিও আমরা টিপলগুলির কয়েকটি আকারের জন্য কোনও মান টাইপ ব্যবহার করার সময় এটির গতিবেগ অনুভব করে কিনা তা দেখার জন্য এফ # টিমকে কিছু কার্য সম্পাদন তদন্ত করতে বলেছিলাম। এটি পরীক্ষার জন্য এটি একটি ভাল উপায় ছিল, কারণ এর সংকলক, এফ # তে লিখিত, একটি বিশাল প্রোগ্রামের একটি ভাল উদাহরণ ছিল যা বিভিন্ন পরিস্থিতিতে দৃশ্যে ব্যবহৃত হয়েছিল example শেষ পর্যন্ত, এফ # টিমের সন্ধান পেয়েছিল যে যখন কিছু টিপলস রেফারেন্স ধরণের পরিবর্তে মান ধরণের হয় তখন এটি পারফরম্যান্সের উন্নতি পায় না। এটি আমাদের টিউপলের জন্য রেফারেন্স প্রকারগুলি ব্যবহার করার বিষয়ে আমাদের সিদ্ধান্ত সম্পর্কে আরও ভাল অনুভব করেছে।
.NET System.Tuple <...> প্রকারগুলি স্ট্রাক্ট হিসাবে সংজ্ঞায়িত করা থাকলে সেগুলি স্কেলযোগ্য হবে না। উদাহরণস্বরূপ, দীর্ঘ পূর্ণসংখ্যার একটি ত্রৈমাসিক টিপল বর্তমানে নীচে হিসাবে স্কেল করে:
type Tuple3 = System.Tuple<int64, int64, int64>
type Tuple33 = System.Tuple<Tuple3, Tuple3, Tuple3>
sizeof<Tuple3> // Gets 4
sizeof<Tuple33> // Gets 4
যদি ত্রৈমাসিক টিপলটিকে স্ট্রাক্ট হিসাবে সংজ্ঞায়িত করা হয় তবে ফলাফলটি নীচে হবে (আমি প্রয়োগ করা পরীক্ষার উদাহরণের ভিত্তিতে):
sizeof<Tuple3> // Would get 32
sizeof<Tuple33> // Would get 104
যেহেতু টিপলগুলি এফ # তে অন্তর্নির্মিত বাক্য গঠন সমর্থন করে এবং এ ভাষাতে এটি প্রায়শই ব্যবহৃত হয়, "স্ট্রাক্ট" টিউপলগুলি এফ সচেতন না হয়েও অকার্যকর প্রোগ্রাম লেখার ঝুঁকিতে এফ # প্রোগ্রামারকে ডেকে আনতে পারে। এটি এত সহজে ঘটবে:
let t3 = 1L, 2L, 3L
let t33 = t3, t3, t3
আমার মতে, "স্ট্রাক্ট" টিউপসগুলি প্রতিদিনের প্রোগ্রামিংয়ে উল্লেখযোগ্য অদক্ষতা তৈরি করার উচ্চ সম্ভাবনা তৈরি করে। অন্যদিকে, বর্তমানে বিদ্যমান "শ্রেণি" টিউপসগুলিও কিছু অদক্ষতার কারণ ঘটায়, যেমনটি @ জোন উল্লেখ করেছেন। তবে আমি মনে করি যে "সংঘটন সম্ভাবনার" গুণ "সম্ভাব্য ক্ষতি" এর পণ্যটি বর্তমানে ক্লাসগুলির তুলনায় স্ট্রাইকগুলির সাথে অনেক বেশি হবে। অতএব, বর্তমান বাস্তবায়ন কম মন্দ।
আদর্শভাবে, উভয় "ক্লাস" টিউপলস এবং "স্ট্রাক্ট" টিপলস উভয়ই এফ # তে সিনট্যাকটিক সমর্থন সহ থাকতে পারে!
সম্পাদনা (2017-10-07)
স্ট্রাক্ট টিউপসগুলি এখন নীচে সম্পূর্ণরূপে সমর্থিত:
ref
, বা এটি পছন্দও করতে পারে না যে তথাকথিত "অপরিবর্তনীয় স্ট্রাক্টগুলি" হয় না, বিশেষত বাক্সযুক্ত হওয়ার পরে। এটা খুবই খারাপ .net একটি প্রয়োগযোগ্য দ্বারা পরামিতি ক্ষণস্থায়ী ধারণা বাস্তবায়িত কখনই const ref
, যেহেতু অনেক ক্ষেত্রে এই ধরনের শব্দার্থবিদ্যা হয় কি সত্যিই প্রয়োজন হয়।
Dictionary
, যেমন: এখানে স্ট্যাকওভারফ্লো
2-টিউপলসের জন্য, আপনি এখনও সর্বদা কমন টাইপ সিস্টেমের পূর্ববর্তী সংস্করণগুলি থেকে কীভ্যালিউপায়ার <টিকি, টিভিয়াল> ব্যবহার করতে পারেন। এটি একটি মান ধরণের।
ম্যাট এলিস নিবন্ধটির একটি সামান্য ব্যাখ্যা হ'ল অপরিবর্তনশীলতা কার্যকর হলে (যা অবশ্যই এখানে ঘটবে) রেফারেন্স এবং মান ধরণের মধ্যে শব্দার্থবিজ্ঞানের ব্যবহারের পার্থক্য কেবল "সামান্য"। তবুও, আমি মনে করি যে টিপলকে কোনও প্রান্তিকের কোনও রেফারেন্সের ধরণে নিয়ে যাওয়ার বিভ্রান্তির পরিচয় না দিয়ে বিসিএল ডিজাইনে সবচেয়ে ভাল হত।
আমি জানি না তবে আপনি যদি কখনও এফ # টিপল ব্যবহার করেন তবে ভাষার অংশ are আমি যদি একটি .dll তৈরি করেছি এবং একটি ধরণের টিউপলস ফিরিয়ে দিয়েছি তবে এটি লিখতে ভাল লাগবে I আমি এখন সন্দেহ করি যে এফ # ভাষার একটি অংশ (। নেট 4) কিছু সাধারণ কাঠামো সামঞ্জস্য করার জন্য সিএলআরতে কিছু পরিবর্তন করা হয়েছিল এফ # তে
Http://en.wikibooks.org/wiki/F_Sharp_Programming/Tuples_and_Record থেকে
let scalarMultiply (s : float) (a, b, c) = (a * s, b * s, c * s);;
val scalarMultiply : float -> float * float * float -> float * float * float
scalarMultiply 5.0 (6.0, 10.0, 20.0);;
val it : float * float * float = (30.0, 50.0, 100.0)
ValueTuple<...>
। সি # টিপল প্রকারের