আইআইএফ () এবং যদি এর মধ্যে পারফরম্যান্স পার্থক্য


98

ভিজ্যুয়াল বেসিকটিতে স্টেটমেন্টের IIfপরিবর্তে ফাংশনটি ব্যবহার করার সময় পারফরম্যান্সের পার্থক্য রয়েছে If?

উত্তর:


140

ভিবিতে নিম্নলিখিত Ifবিবৃতি রয়েছে যা প্রশ্নটি উল্লেখ করে, আমি মনে করি:

' Usage 1
Dim result = If(a > 5, "World", "Hello")
' Usage 2
Dim foo = If(result, "Alternative")

প্রথম মূলত সি # 'গুলি তিন শর্তসাপেক্ষ অপারেটর এবং দ্বিতীয় তার একসঙ্গে বেড়ে ওঠা অপারেটর (আগমন resultযদি না এটা Nothingযে ক্ষেত্রে বিনিময়ে, "Alternative")। Ifএইভাবে প্রতিস্থাপন করা হয়েছে IIfএবং পরেরটি অপ্রচলিত।

সি # এর মতো, ভিবি'র শর্তসাপেক্ষ Ifঅপারেটর শর্ট সার্কিট, সুতরাং আপনি এখন নিরাপদে নিম্নলিখিতটি লিখতে পারেন যা IIfফাংশনটি ব্যবহার করে সম্ভব নয় :

Dim len = If(text Is Nothing, 0, text.Length)

4
আপনি পারফরম্যান্স প্রশ্নের উত্তর দেননি এবং এর পার্শ্ব প্রতিক্রিয়াগুলিও উল্লেখ করেননি IIf
jor

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

4
@ মিমক্রাই এটি সঠিক এবং উদ্দেশ্য অনুসারে: যেমনটি আমি বলেছি, IIf অপ্রচলিত, তাই এটি নিয়ে আলোচনা করার কোনও ধারণা নেই। বলেছিল, আমার শেষ অনুচ্ছেদটি প্রাসঙ্গিক পার্থক্য নিয়ে আলোচনা করে। সত্যই আপনার এটি জানা দরকার।
কনরাড রুডল্ফ

4
আমি প্রশংসা করি আপনি ভাল মান সমর্থন করতে চান এবং newbies খারাপ অভ্যাসগুলি গ্রহণ করবেন না তা নিশ্চিত করে, তবে কারওর মধ্যে একটি সঠিক বৈধ সমস্যা থাকতে পারে যার কারণে তারা পার্থক্যটি আরও ভালভাবে বুঝতে চায় ... যেমন লিগ্যাসি কোড বজায় রাখা, সাথে আটকে থাকা কিছু অন্যান্য সরঞ্জাম যা এটি ব্যবহার করে, ইত্যাদি এবং That's all you need to know, reallyজ্ঞান ভাগ করে নেওয়ার জন্য উত্সর্গীকৃত কোনও ওয়েবসাইটের পক্ষে অনুকূল মনোভাব বলে মনে হয় না;)
ডন চ্যাডল

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

65

IIf()সত্য এবং মিথ্যা উভয় কোড চালায়। সংখ্যাগত কার্যবিধির মতো সাধারণ জিনিসের জন্য, এটি কোনও বড় বিষয় নয়। তবে কোডের জন্য যে কোনও প্রক্রিয়াকরণের প্রয়োজন, আপনি চক্রটি নষ্ট করছেন এমন শর্তটি নষ্ট করছেন যা সম্ভবত পার্শ্ব প্রতিক্রিয়া সৃষ্টি করে।

কোড চিত্র:

Module Module1
    Sub Main()
        Dim test As Boolean = False
        Dim result As String = IIf(test, Foo(), Bar())
    End Sub

    Public Function Foo() As String
        Console.WriteLine("Foo!")
        Return "Foo"
    End Function

    Public Function Bar() As String
        Console.WriteLine("Bar!")
        Return "Bar"
    End Function
End Module

ফলাফল:

Foo!
Bar!

13

এছাড়াও, আইআইএফ-এর সাথে আর একটি বড় সমস্যা হ'ল এটি আসলে যুক্তিগুলিতে থাকা কোনও ফাংশনকে কল করবে [1], সুতরাং আপনার যদি নীচের মতো পরিস্থিতি থাকে:

string results = IIf(Not oraData.IsDBNull(ndx), oraData.GetString(ndx), string.Empty)

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

[১] আইআইএফ ফাংশন - http://msdn.microsoft.com/en-us/library/27ydhh0d(VS.71).aspx


এই কারণেই যদি পুরানো আইআইএফ প্রতিস্থাপন করতে আসে তবে আইআইএফের সাথে আমার সমস্যা ছিল তবে আইএফ অনেকগুলি কোডের লাইন যুক্ত করে সংরক্ষণ করে।
নিল

7

আইফার পরিবর্তে টাইপ আনফারেন্স মেকানিজমটি সঠিকভাবে ব্যবহার করতে অপশন ব্যবহার করুন (অপশন ইনফার অন)

এই উদাহরণে, কীওয়ার্ডগুলি স্ট্রিং হিসাবে স্বীকৃত যখন আমি ব্যবহার করি:

Dim Keywords = If(String.IsNullOrEmpty(SelectedKeywords), "N/A", SelectedKeywords)

অন্যথায়, এটি একটি অবজেক্ট হিসাবে স্বীকৃত:

Dim Keywords = IIf(String.IsNullOrEmpty(SelectedKeywords), "N/A", SelectedKeywords)

6

এই লোকটির মতে , আইআইএফ যদি / ততক্ষণ 6x পর্যন্ত সময় নিতে পারে। ওয়াইএমএমভি


4
আমার অভিজাতীয় গণনাগুলিতে (10000000 চক্র), আমি আইআইএফকে প্রায় 12x ধীর বলে মূল্যায়ন করেছি!
ফ্যান্টিম্যাক্সেক্স

6

সর্বোপরি, পঠনযোগ্যতা সম্ভবত এই ক্ষেত্রে পারফরম্যান্সের চেয়ে বেশি পছন্দ করা উচিত। আইআইএফ যদি আরও দক্ষ ছিল, তবে লক্ষ্য শ্রোতার কাছে এটি কেবল সহজ পাঠযোগ্য হবে (আমি ধরে নিই যে আপনি ভিজ্যুয়াল বেসিকটিতে কাজ করছেন কিনা, আপনি চান যে অন্যান্য প্রোগ্রামাররা আপনার কোডটি সহজেই পড়তে সক্ষম হবে, যা ভিবি'র সবচেয়ে বড় वरदान ... এবং যা আমার মতে IIF এর মত ধারণার সাথে হারিয়ে গেছে)।

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


6

আমি বিশ্বাস করি যে ইফ এবং আইআইএফ এর মধ্যে প্রধান পার্থক্য:

  • যদি (পরীক্ষা [বুলেটিয়ান], স্টেটমেন্ট 1, স্টেটমেন্ট 2) এর অর্থ হল পরীক্ষার মান অনুসারে হয় সেটেন্ট 1 বা স্টেটমেন্ট 2 কার্যকর করা হবে (কেবলমাত্র একটি বিবৃতি কার্যকর হবে)

  • ডিম ইজম = আইআইএফ (পরীক্ষা [বুলেটিয়ান], স্টেটমেন্ট ১, স্টেটমেন্ট ২) এর অর্থ উভয় বিবৃতি কার্যকর হবে তবে পরীক্ষার মান অনুসারে এর মধ্যে একটি মান (অবজেক্ট) -এর মান প্রদান করবে।

সুতরাং যদি বিবৃতিগুলির মধ্যে একটি ব্যতিক্রম ছুঁড়ে ফেলে তবে এটি (IIF) এ তা ফেলে দেবে তবে (যদি) শর্তটি তার মানটি ফেরত দেয় তবে এটি এটি ফেলে দেবে।


5

... কেন এটি 6x হিসাবে বেশি সময় নিতে পারে, উইকির পরিমাণটি:

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

অপরিহার্যভাবে আইআইএফ সি ++ / সি # তে একটি টার্নারি অপারেটরের সমতুল্য, সুতরাং / আপনি যদি চান তা যদি বিবৃতি টাইপ করে তবে এটি আপনাকে কিছু সুন্দর 1 লাইন দেয়। আপনি যদি চান তবে এটি মূল্যায়নের জন্য একটি ফাংশনও দিতে পারেন।


1

সেই ফাংশন গুলো আলাদা! সম্ভবত আপনার কেবল আইএফ স্টেটমেন্ট ব্যবহার করা দরকার। আইআইএফ সর্বদা ধীর থাকবে কারণ এটি উভয় ফাংশনই করবে এবং এটি স্ট্যান্ডার্ড আইএফ স্টেটমেন্টটি করবে।

আপনি যদি ভাবছেন যে কেন আইআইএফ ফাংশন রয়েছে, তবে এটি ব্যাখ্যা হতে পারে:

Sub main()
    counter = 0
    bln = True
    s = iif(bln, f1, f2)
End Sub

Function f1 As String
    counter = counter + 1
    Return "YES"
End Function

Function f2 As String
    counter = counter + 1
    Return "NO"
End Function

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


যদি আপনার চালনার জন্য উভয়ের প্রয়োজন হয় তবে আপনার স্পষ্টতই তাদের উভয়কে কল করা উচিত এবং তারপরে একটি মানক করা উচিত। IIf()এইভাবে ব্যবহার করা কেবল আপনার কোড পড়ে লোকজনকে বিভ্রান্ত করছে।
স্পাইভিনিয়াস

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