কেন পর্দার পিছনে টাইপডেফারেন্স? এটি এত দ্রুত এবং নিরাপদ ... প্রায় জাদুকরী!


128

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

কেউ কি জানেন যে কেন টাইপডেফারেন্সের ব্যবহার এতটা নিরুৎসাহিত হয় ( স্পষ্টতই , ডকুমেন্টের অভাবে)?

আমি এটির জন্য দুর্দান্ত ব্যবহারগুলি পেয়েছি যেমন যেমন জেনেরিক না হওয়া উচিত এমন ফাংশনগুলির মাধ্যমে জেনেরিক পরামিতিগুলি পাস করার সময় (যখন objectকোনও মান ধরণের প্রয়োজন হলে খুব বেশি পরিমাণে বা ধীর হতে পারে) তখন যখন আপনার অস্বচ্ছ পয়েন্টার প্রয়োজন হয়, বা কারণ যখন আপনার কোনও অ্যারের কোনও উপাদান দ্রুত অ্যাক্সেস করার দরকার হয়, যার স্পেসগুলি আপনি রানটাইমে খুঁজে পেয়েছেন (ব্যবহার করছেন Array.InternalGetReference)। যেহেতু সিএলআর এই ধরণের ভুল ব্যবহারের অনুমতিও দেয় না, কেন এটি নিরুৎসাহিত করা হচ্ছে? এটি নিরাপদ বা অন্য কিছু বলে মনে হচ্ছে না ...


অন্যান্য ব্যবহার আমি খুঁজে পেয়েছি TypedReference:

সি # তে জেনেরিকগুলি বিশেষজ্ঞকরণ (এটি টাইপ-নিরাপদ):

static void foo<T>(ref T value)
{
    //This is the ONLY way to treat value as int, without boxing/unboxing objects
    if (value is int)
    { __refvalue(__makeref(value), int) = 1; }
    else { value = default(T); }
}

লিখিত কোড যা জেনেরিক পয়েন্টারগুলির সাথে কাজ করে (এটি অপব্যবহার করা হলে এটি খুব নিরাপদ তবে সঠিকভাবে ব্যবহার করা হলে দ্রুত এবং নিরাপদ):

//This bypasses the restriction that you can't have a pointer to T,
//letting you write very high-performance generic code.
//It's dangerous if you don't know what you're doing, but very worth if you do.
static T Read<T>(IntPtr address)
{
    var obj = default(T);
    var tr = __makeref(obj);

    //This is equivalent to shooting yourself in the foot
    //but it's the only high-perf solution in some cases
    //it sets the first field of the TypedReference (which is a pointer)
    //to the address you give it, then it dereferences the value.
    //Better be 10000% sure that your type T is unmanaged/blittable...
    unsafe { *(IntPtr*)(&tr) = address; }

    return __refvalue(tr, T);
}

নির্দেশের একটি পদ্ধতি সংস্করণ লিখন sizeof, যা মাঝে মধ্যে কার্যকর হতে পারে:

static class ArrayOfTwoElements<T> { static readonly Value = new T[2]; }

static uint SizeOf<T>()
{
    unsafe 
    {
        TypedReference
            elem1 = __makeref(ArrayOfTwoElements<T>.Value[0] ),
            elem2 = __makeref(ArrayOfTwoElements<T>.Value[1] );
        unsafe
        { return (uint)((byte*)*(IntPtr*)(&elem2) - (byte*)*(IntPtr*)(&elem1)); }
    }
}

এমন একটি পদ্ধতি লেখা যা "স্টেট" পরামিতি পাস করে যা বক্সিং এড়াতে চায়:

static void call(Action<int, TypedReference> action, TypedReference state)
{
    //Note: I could've said "object" instead of "TypedReference",
    //but if I had, then the user would've had to box any value types
    try
    {
        action(0, state);
    }
    finally { /*Do any cleanup needed*/ }
}

তাহলে কেন এই "নিরুৎসাহিত" (ডকুমেন্টেশনের অভাবে) ব্যবহারের মতো? কোনও বিশেষ সুরক্ষার কারণ? এটি পুরোপুরি নিরাপদ এবং যাচাইযোগ্য মনে হচ্ছে যদি এটি পয়েন্টারগুলির সাথে মিশ্রিত না হয় (যা নিরাপদ বা যাচাইযোগ্য নয়) তবে ...


হালনাগাদ:

নমুনা কোডটি দেখানোর জন্য, প্রকৃতপক্ষে TypedReferenceদ্বিগুণ দ্রুত (বা আরও) হতে পারে:

using System;
using System.Collections.Generic;
static class Program
{
    static void Set1<T>(T[] a, int i, int v)
    { __refvalue(__makeref(a[i]), int) = v; }

    static void Set2<T>(T[] a, int i, int v)
    { a[i] = (T)(object)v; }

    static void Main(string[] args)
    {
        var root = new List<object>();
        var rand = new Random();
        for (int i = 0; i < 1024; i++)
        { root.Add(new byte[rand.Next(1024 * 64)]); }
        //The above code is to put just a bit of pressure on the GC

        var arr = new int[5];
        int start;
        const int COUNT = 40000000;

        start = Environment.TickCount;
        for (int i = 0; i < COUNT; i++)
        { Set1(arr, 0, i); }
        Console.WriteLine("Using TypedReference:  {0} ticks",
                          Environment.TickCount - start);
        start = Environment.TickCount;
        for (int i = 0; i < COUNT; i++)
        { Set2(arr, 0, i); }
        Console.WriteLine("Using boxing/unboxing: {0} ticks",
                          Environment.TickCount - start);

        //Output Using TypedReference:  156 ticks
        //Output Using boxing/unboxing: 484 ticks
    }
}

(সম্পাদনা করুন: আমি উপরের মাপদণ্ডটি সম্পাদনা করেছি, যেহেতু পোস্টের সর্বশেষ সংস্করণটি কোডের একটি ডিবাগ সংস্করণ ব্যবহার করেছে [আমি এটি প্রকাশে পরিবর্তন করতে ভুলে গিয়েছি]) এবং জিসির উপর কোনও চাপ রাখিনি This এই সংস্করণটি আরও কিছুটা বাস্তবসম্মত এবং আমার সিস্টেমে এটি TypedReferenceগড়ে তিনগুণ বেশি দ্রুত faster


আমি যখন আপনার উদাহরণ চালনা করি তখন আমি সম্পূর্ণ ভিন্ন ফলাফল পাই। TypedReference: 203 ticks, boxing/unboxing: 31 ticks। আমি যা চেষ্টা করি তা নয় (টাইমিংয়ের বিভিন্ন উপায় সহ) বক্সিং / আনবক্সিং আমার সিস্টেমে এখনও দ্রুত।
Seph

1
@ সেফ: আমি আপনার মন্তব্যটি কেবল দেখেছি। এটি অত্যন্ত আকর্ষণীয় - এটি x64 তে দ্রুত বলে মনে হচ্ছে তবে x86 এর চেয়ে ধীর। অদ্ভুত ...
user541686

1
আমি মাত্র .NET 4.5 এর অধীনে আমার এক্স 64 মেশিনে সেই বেঞ্চমার্ক কোডটি পরীক্ষা করেছি। আমি ডায়াগনস্টিক্স.স্টপওয়াচের সাথে এনভায়রনমেন্ট.টিকাউন্টকে প্রতিস্থাপন করেছি এবং টিকের পরিবর্তে এমএস দিয়ে চলেছি। আমি প্রতিটি বিল্ড (x86, 64, যেকোন) তিনবার চালিয়েছি। তিনটি ফলাফলের মধ্যে সেরাটি ফলস হিসাবে ছিল: x86: 205 / 27ms (এই বিল্ডে 2/3 রানের জন্য একই ফলাফল) x64: 218 / 109ms যে কোনও: 205/27 মিমি (এই বিল্ডে 2/3 রানের জন্য একই ফলাফল) ইন সমস্ত ক্ষেত্রে কেস বক্স / আনবক্সিং দ্রুত ছিল।
kornman00

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

1
টাইপরেফ কাস্টিংয়ের লাভগুলি দেখতে, এটি কম তুচ্ছ করুন make যেমন এনাম টাইপ ( int-> DockStyle) এ অন্তর্নিহিত টাইপ typeালাই । এই বাক্সগুলি বাস্তবের জন্য, এবং প্রায় দশগুণ ধীর।
হাইপার্সউ

উত্তর:


42

সংক্ষিপ্ত উত্তর: বহনযোগ্যতা

যদিও __arglist, __makerefএবং __refvalueহয় ভাষা এক্সটেনশন এবং C # ভাষা নির্দিষ্টকরণ মধ্যে অনথিভুক্ত তাদের ফণা অধীন প্রয়োগ করতে ব্যবহৃত নির্মান ( varargকনভেনশন আহ্বান, TypedReferenceধরন, arglist, refanytype, mkanyref, এবং refanyvalনির্দেশাবলী) পুরোপুরি মধ্যে নথিভুক্ত করা হয় , CLI স্পেসিফিকেসন (ECMA-335) মধ্যে Vararg গ্রন্থাগার

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

4.1.6 ভারার্গ

Vararg বৈশিষ্ট্য সেট পরিবর্তনশীল দৈর্ঘ্যের যুক্তি তালিকা এবং রানটাইম টাইপ পয়েন্টার সমর্থন করে।

বাদ দেওয়া থাকলে:vararg কলিং কনভেনশন বা বৈরগ পদ্ধতিগুলির সাথে স্বাক্ষরযুক্ত এনকোডিংগুলির সাথে কোনও পদ্ধতি উল্লেখ করার কোনও প্রচেষ্টা (দ্বিতীয় বিভাগটি দেখুন) System.NotImplementedExceptionব্যতিক্রম নিক্ষেপ করবে । CIL নির্দেশাবলী ব্যবহার পদ্ধতি arglist, refanytype, mkrefany, এবং refanyvalনিক্ষেপ করিবে System.NotImplementedExceptionব্যতিক্রম। ব্যতিক্রমটির সঠিক সময় নির্দিষ্ট করা হয়নি। প্রকারটি System.TypedReferenceসংজ্ঞায়িত করা দরকার না।

আপডেট ( GetValueDirectমন্তব্যের জবাব ):

FieldInfo.GetValueDirectহয় FieldInfo.SetValueDirectহয় না বেজ ক্লাস লাইব্রেরির অংশ। নোট ফ্রেমওয়ার্ক ক্লাস লাইব্রেরি এবং বেস ক্লাস লাইব্রেরি মধ্যে পার্থক্য আছে তা নোট করুন। বিসিএলই সিএলআই / সি # এর যথাযথ বাস্তবায়নের জন্য প্রয়োজনীয় একমাত্র জিনিস এবং ইসিএমএ টিআর / 84 তে নথিভুক্ত । (প্রকৃতপক্ষে, FieldInfoনিজেই প্রতিচ্ছবি গ্রন্থাগারের অংশ এবং এটি সিএলআই কার্নেল প্রোফাইলে অন্তর্ভুক্ত নেই)।

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

তারা যদি এটি সি # তে নথিভুক্ত করে থাকে তবে এতে অন্ততপক্ষে দু'জনকে জড়িয়ে থাকতে পারে:

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

4
বহনযোগ্যতার জন্য ভাল যুক্তি, +1। তবে কি FieldInfo.GetValueDirectআর FieldInfo.SetValueDirect? তারা ছাত্রলীগের অংশ, এবং আপনার প্রয়োজনীয় সেগুলি ব্যবহার করার জন্য TypedReference, তাই TypedReferenceভাষা-বর্ণটি নির্বিশেষে মূলত সর্বদা সংজ্ঞায়িত করতে বাধ্য হয় না? (এছাড়াও, অন্য একটি দ্রষ্টব্য: কীওয়ার্ডগুলি অস্তিত্ব না থাকলেও, যতক্ষণ না নির্দেশাবলী বিদ্যমান ছিল, ততক্ষণ আপনি গতিশীলভাবে নির্গমন পদ্ধতিগুলি দ্বারা এগুলি অ্যাক্সেস করতে পারবেন ... যতক্ষণ আপনার প্ল্যাটফর্ম সি লাইব্রেরিতে ইন্টারপোপ করে থাকে, আপনি এগুলি ব্যবহার করতে পারেন, সি # এর কীওয়ার্ড রয়েছে কি না))
ব্যবহারকারী 541686

ওহ, এবং অন্য ইস্যু: এটি পোর্টেবল না হলেও তারা কীওয়ার্ডগুলি নথি করেনি কেন? খুব কমপক্ষে, সি ভারার্গসের সাথে ইন্টারপো করার সময় এটি প্রয়োজনীয়, তাই কমপক্ষে তারা এটি উল্লেখ করতে পারতেন?
user541686

@ মেহরদাদ: হু, এটি আকর্ষণীয়। আমার ধারণা আমি সর্বদা ধরে নিয়েছি যে .NET উত্সের বিসিএল ফোল্ডারে থাকা ফাইলগুলি বিসিএলের অংশ, ইসিএমএ মানককরণের অংশটির দিকে সত্যই কখনই মনোযোগ দেয় না। এটি একটি সামান্য জিনিস ব্যতীত ... দৃ pretty় প্রত্যয়যুক্ত: এটি কোথাও কীভাবে ব্যবহার করবেন সে সম্পর্কে কোনও দলিল না থাকলে, সিএলআই স্পেসে (alচ্ছিক) বৈশিষ্ট্যটি অন্তর্ভুক্ত করা কি একেবারেই অর্থহীন নয়? (যদি TypedReferenceএটি কেবল একটি ভাষার জন্য নথিভুক্ত করা হয় তবে তা বোঝা যাবে - বলুন, পরিচালিত সি ++ - তবে কোনও ভাষা যদি এটিকে নথি করে না এবং তাই যদি কেউ সত্যই এটি ব্যবহার করতে না পারে তবে বৈশিষ্ট্যটি সংজ্ঞায়িত করতে কেন কেন বিরক্ত করবেন?)
ব্যবহারকারী ৫৪6841414168

@ মেহরদাদ আমি সন্দেহ করি যে আন্তঃনীতি ( উদাঃ [DllImport("...")] void Foo(__arglist); ) এর অভ্যন্তরীণভাবে এই বৈশিষ্ট্যটির প্রাথমিক অনুপ্রেরণার প্রয়োজন ছিল এবং তারা নিজের ব্যবহারের জন্য এটি সি # তে প্রয়োগ করেছিল। সিএলআইয়ের নকশা অনেকগুলি ভাষা দ্বারা প্রভাবিত হয় (টীকাগুলি "কমন ল্যাঙ্গুয়েজ অবকাঠামো অ্যানোটেটেড স্ট্যান্ডার্ড" এই সত্যটি দেখায়) নাম) এবং এটি এমন একটি বৈশিষ্ট্য যা উদাহরণস্বরূপ, একটি হাইপোথেটিকাল পরিচালিত সি বাস্তবায়ন সম্ভবত উপকৃত হতে পারে।
মেহরদাদ আফশারি

@ মেহরদাদ: আহ ... হ্যাঁ, এটি একটি দৃ conv় প্রত্যয়ী কারণ। ধন্যবাদ!
user541686

15

ঠিক আছে, আমি কোনও এরিক লিপার্ট নই, তাই আমি মাইক্রোসফ্টের প্রেরণাগুলি সরাসরি বলতে পারি না, তবে যদি আমি কোনও অনুমান করার চেষ্টা করি তবে আমি TypedReferenceএট আল বলতাম । যথাযথভাবে নথিভুক্ত করা হয় নি, সত্যি বলতে গেলে, আপনার এগুলির দরকার নেই।

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

এটি এমনটি বলার অপেক্ষা রাখে না যে নির্দিষ্ট পারফরম্যান্স বিবেচনার সাধ্য নেই। প্রকৃতপক্ষে, পয়েন্টার, stackallocএবং কিছু অনুকূলিত কাঠামো ফাংশনগুলির মতো বৈশিষ্ট্যগুলি নির্দিষ্ট পরিস্থিতিতে কর্মক্ষমতা বাড়ানোর জন্য মূলত বিদ্যমান।

জেনারিকস, যা আমি বলব ধরণের সুরক্ষার প্রাথমিক উপকার রয়েছে, এছাড়াও TypedReferenceবক্সিং এবং আনবক্সিং এড়িয়ে কর্মক্ষমতা উন্নত করে। আসলে, আমি ভাবছিলাম যে আপনি এটি কেন পছন্দ করবেন:

static void call(Action<int, TypedReference> action, TypedReference state){
    action(0, state);
}

এটি:

static void call<T>(Action<int, T> action, T state){
    action(0, state);
}

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

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


4
হু ... "আপনার তাদের দরকার নেই" - আমার আসা উচিত ছিল। :-) এটি সত্য তবে এটিও সত্য নয়। "প্রয়োজন" হিসাবে আপনি কী সংজ্ঞা দেন? উদাহরণস্বরূপ, কী কী এক্সটেনশন পদ্ধতিগুলি "প্রয়োজনীয়"? আপনার জেনেরিকাগুলি ব্যবহার করার প্রশ্ন সম্পর্কে call(): এটি কোডটি সর্বদা এতটা সংহতিযুক্ত না কারণ - আমি এর চেয়ে বেশি উদাহরণের সাথে আরও উল্লেখ করছি IAsyncResult.State, যেখানে জেনেরিকাগুলি প্রবর্তন করা সহজসাধ্য হবে না কারণ হঠাৎ করেই এটি জেনেরিকাগুলির পরিচয় দেয় would জড়িত প্রতিটি শ্রেণি / পদ্ধতি উত্তরের জন্য +1, যদিও ... বিশেষত "জাভা থেকে দ্রুত" অংশটি নির্দেশ করার জন্য। :]
user541686

1
ওহ, এবং অন্য একটি বিষয়: TypedReferenceসম্ভবত FieldInfo.SetValueDirect , যা সর্বজনীন এবং সম্ভবত কিছু বিকাশকারী দ্বারা ব্যবহার করা হয়েছে , প্রদত্ত ফিল্ডইনফোর.সেটভ্যালু ডাইরেক্টের ভিত্তিতে সম্ভবত এর আগে ব্রেকিং পরিবর্তনের মধ্য দিয়ে যাবে না । :)
user541686

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

1
@ মেরহাদাদ: আমি তখন ইন্টারপ্রোসেস / ইন্টারহোস্ট যোগাযোগের (টিসিপি এবং পাইপ) জন্য বাইনারি অবজেক্ট সিরিয়ালাইজার / ডিসরিয়ালাইজারে কাজ করছিলাম। আমার লক্ষ্যগুলি এটিকে যতটা সম্ভব ছোট (তারের উপরে পাঠানো বাইটের শর্তে) করা এবং দ্রুত (সময়ের সাথে সাথে সিরিয়ালাইজিং ও ডিসরিয়ালাইজিংয়ে ব্যয় করা) করা সম্ভব হয়েছিল। আমি ভেবেছিলাম যে আমি কিছু বক্সিং এবং এসগুলির সাথে TypedReferenceআনবক্সিং এড়াতে পারি তবে আইআইআরসি, আমি কোথাও বক্সিং এড়াতে সক্ষম হয়েছি এমন একমাত্র জায়গাটি ছিল আদিমতার একক মাত্রিক অ্যারের উপাদানগুলির সাথে। এখানে সামান্য গতির সুবিধার জন্য এটি পুরো প্রকল্পে যে জটিলতা যুক্ত হয়েছিল তার মূল্য ছিল না, তাই আমি এটিকে বাইরে নিয়ে এসেছি।
পি ড্যাডি

1
delegate void ActByRef<T1,T2>(ref T1 p1, ref T2 p2);প্রকারের সংকলন দেওয়া একটি Tপদ্ধতি সরবরাহ করতে পারে ActOnItem<TParam>(int index, ActByRef<T,TParam> proc, ref TParam param)তবে জেআইটিআর প্রতিটি মান ধরণের জন্য পদ্ধতির একটি আলাদা সংস্করণ তৈরি করতে হবে TParam। একটি টাইপযুক্ত রেফারেন্স ব্যবহার করে পদ্ধতির একটি JITted সংস্করণ সমস্ত পরামিতি প্রকারের সাথে কাজ করার অনুমতি দেয়।
সুপারক্যাট

4

এই প্রশ্নের শিরোনামটি ব্যঙ্গাত্মক হওয়ার কথা কিনা তা আমি বুঝতে পারি না: এটি দীর্ঘকাল প্রতিষ্ঠিত হয়েছে যা TypedReference'সত্য' পরিচালিত পয়েন্টারগুলির ধীর, ফুলে যাওয়া, কুরুচিপূর্ণ কাজিন, পরবর্তীটি আমরা সি ++ / সিএলআইয়ের সাথে যা পাই interior_ptr<T>, বা এমনকি সি # তে প্রচলিত বাই-রেফারেন্স ( ref/ out) পরামিতি । প্রকৃতপক্ষে, প্রতিবার আসল সিএলআর অ্যারেটিকে পুনরায় সূচি দেওয়ার জন্য একটি পূর্ণসংখ্যার ব্যবহার করে এমনকি বেসল পারফরম্যান্সে পৌঁছানো বেশ শক্ত ।TypedReference

দু: খজনক বিশদটি এখানে রয়েছে , তবে ধন্যবাদ, এখন এইগুলির কোনওটিই ...

এই প্রশ্নের এখন নতুন দ্বারা তর্ক করা রেন্ডার করা হয় তখন সুত্র স্থানীয়দের এবং সুত্র আগমন বৈশিষ্ট্য সি # 7

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

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

এবং স্পষ্টতই, TypedReferenceএটির প্রায় সম্পূর্ণ __makerefঅবমূল্যায়ন - এর মৃত্যুর অর্থ জাঙ্কেপকেও ফেলে দেওয়া ।

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