লিনকিউ স্টেটমেন্টটি কি 'ফোরচ' লুপের চেয়ে দ্রুত?


124

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

আমি বর্তমানে একটি foreachলুপ ব্যবহার করছি , তবে ভাবছি লিনকিউ ব্যবহার করা যদি আমাকে কোনও কার্যকারিতা বাড়িয়ে দেয়?



1
অনুগ্রহ করে @ মার্কগ্রাভেল এর গৃহীত উত্তরটির উত্তরটি নির্ধারণ করুন, এমন পরিস্থিতি রয়েছে, উদাহরণস্বরূপ লিনাক থেকে স্ক্যুয়েল, যেখানে লিনক ফর / ফরচের চেয়ে দ্রুততর হয়।
পাকোগোমেজ

উত্তর:


222

কেন লিনকিউ দ্রুত হওয়া উচিত? এটি অভ্যন্তরীণভাবে লুপগুলিও ব্যবহার করে।

বেশিরভাগ সময়, লিনকিউ কিছুটা ধীর হয়ে যায় কারণ এটি ওভারহেডের পরিচয় দেয়। আপনি যদি পারফরম্যান্স সম্পর্কে বেশি যত্নশীল হন তবে লিনকিউ ব্যবহার করবেন না। লিনকিউ ব্যবহার করুন কারণ আপনি আরও ভাল পাঠযোগ্য ও রক্ষণাবেক্ষণযোগ্য কোড চান।


7
সুতরাং আপনার অভিজ্ঞতাটি কি লিনিকিউ দ্রুত এবং কোড পড়া এবং বজায় রাখা আরও শক্ত করে তোলে? দয়া করে ব্যাখ্যা করুন.
কোডিমানিক্স

87
আমি মনে করি আপনি এটি পিছিয়ে ছিল। তিনি বলছেন লিনকুই স্লুয়ার। এটি ওভার মাথার কারণে। তিনি আরও বলছেন যে লিনকিউ পড়া এবং বজায় রাখা সহজ।
জোসেফ ম্যাকআইন্টির

5
দুঃখিত। ইতিমধ্যে আমাদের অনেকগুলি জিনিস ছিল যেখানে আমরা লিনক এবং তুলনামূলকভাবে পারফরম্যান্সের তুলনা করি এবং বেশিরভাগ সময় লিনাক ছিল দ্রুততর।
অফার

34
আমার মতে সত্যি কথা বলতে, একটি ফরচ লুপ তার লিনকু পদ্ধতির চেয়ে বেশি পঠনযোগ্য। আমি
লিনকিউটি

4
হ্যাঁ তবে কিছু ক্ষেত্রে লিনকুই সত্যিই পঠনযোগ্যতার উন্নতি করতে পারে, তাই আমার নির্বোধ মন্তব্যটি ভুলে যান <3
লাকলিইকি

59

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

মত অন্যান্য LINQ প্রদানকারীদের সাথে LINQ টু এসকিউএল, তারপর থেকে ক্যোয়ারী সার্ভার এ ফিল্টার করতে পারেন এটা অনেক হওয়া উচিত ভাল একটি ফ্ল্যাট চেয়ে foreach, কিন্তু অধিকাংশ সম্ভবত আপনি একটি কম্বল কাজ করত না "select * from foo" যাহাই হউক না কেন , তাই নয় অগত্যা একটি ন্যায্য তুলনা।

পুনরায় পিনকিউ; সমান্তরালতা অতিবাহিত সময়কে হ্রাস করতে পারে তবে থ্রেড ম্যানেজমেন্টের ওভারহেডগুলির কারণে মোট সিপিইউ সময় সাধারণত কিছুটা বাড়বে etc.


অন্য উত্তরে আপনি মেমরির সংগ্রহগুলিতে LINQ ব্যবহার না করার ইঙ্গিত দিয়েছেন - যেমন List<Foo>; পরিবর্তে, foreachএই সংগ্রহগুলিতে আমার একটি ব্লক ব্যবহার করা উচিত । foreachএই প্রসঙ্গে ব্যবহারের জন্য সুপারিশটি কোনও অর্থবোধ করে না। আমার উদ্বেগ: আমি foreach যদি কোনও পারফরম্যান্সের সমস্যা সনাক্ত করি তবে আমি কেবল লিনকিউ প্রশ্নের সাথে প্রতিস্থাপন করব? এগিয়ে যেতে, আমি foreachপ্রথম বিবেচনা করব ।
IAbstract

19

আমি মনে করি লিনকু একটি foreachলুপের সাহায্যে ব্যবহার করা আরও ভাল , কারণ এটি আপনাকে আরও ক্লিনার এবং সহজেই বোঝার কোড দেয়। তবে লিনকিউ এর চেয়ে ধীর foreach। আরও পেতে, লিনক পারফরম্যান্সের জন্য লিনক বনাম ফোরচে বনাম নিবন্ধটি দেখুন ।


15

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

আরও গুরুত্বপূর্ণ বিষয় যদিও লিনকিউ পড়া খুব সহজ। এটা যথেষ্ট কারণ হতে হবে।


3
আমি "মাইক্রোসফ্ট এটি বাস্তবায়ন করতে পারে" লাইনটি পছন্দ করা সম্ভব, মানে আমি ফ্রেমওয়ার্কটি আপগ্রেড না করেই কি সম্ভব?
শ্রীবল্লভ

1
লিনিকিউ কখনই দেশীয় বাস্তবায়নের চেয়ে দ্রুত গতি পেতে পারে না, যেহেতু দিনের শেষে, এটি স্থানীয় বাস্তবায়নে অনুবাদ করে। লিনকু সিপিইউ সংক্রান্ত কোনও বিশেষ নির্দেশনা এবং লিনকিউ রেজিস্টার নেই যা দ্রুত লিনকুই মেশিন কোডটি অনুবাদ করতে ব্যবহার করা যেতে পারে - এবং যদি সেখানে থাকে তবে সেগুলি লাইন-লিনকো কোড দ্বারাও ব্যবহৃত হত।
এমজি

সত্য নয়, এক পর্যায়ে নির্দিষ্ট লিঙ্ক ক্রিয়াকলাপগুলি বহু-থ্রেডড হয়ে যেতে পারে বা এমনকি কিছু সময় জিপিইউ ব্যবহার করতে পারে।
জন স্টক

11

সম্ভবত এটি লক্ষ করা উচিত যে forলুপটি এর চেয়ে দ্রুত foreach। সুতরাং আসল পোস্টের জন্য, আপনি যদি কোনও রেন্ডারারের মতো সমালোচনামূলক উপাদানটির পারফরম্যান্স সম্পর্কে উদ্বিগ্ন হন তবে একটি forলুপ ব্যবহার করুন ।

তথ্যসূত্র:। নেট, কোন লুপ দ্রুত চলে, 'জন্য' বা 'ফোরচ'?


9

আপনি যদি মাল্টি কোরের জন্য সমান্তরাল লিনকুই ব্যবহার করেন তবে আপনি পারফরম্যান্সের উত্সাহ পেতে পারেন। দেখুন সমান্তরাল LINQ (PLINQ) (দুটিই MSDN)।


5

আমি এই প্রশ্নে আগ্রহী ছিলাম, তাই এখনই একটি পরীক্ষা করেছি। মাইক্রোসফ্ট উইন্ডোজ 7 আলটিমেট চলমান 8 জিবি র‌্যাম সহ একটি ইন্টেল (আর) কোর (টিএম) আই 3-2328 এম সিপিইউতে .NET ফ্রেমওয়ার্ক 4.5.4 ব্যবহার করা।

দেখে মনে হচ্ছে যে লিনকু প্রতিটি লুপের চেয়ে দ্রুত হতে পারে। আমি প্রাপ্ত ফলাফল এখানে:

Exists = True
Time   = 174
Exists = True
Time   = 149

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

public class Program
{
    public class Employee
    {
        public int id;
        public string name;
        public string lastname;
        public DateTime dateOfBirth;

        public Employee(int id,string name,string lastname,DateTime dateOfBirth)
        {
            this.id = id;
            this.name = name;
            this.lastname = lastname;
            this.dateOfBirth = dateOfBirth;

        }
    }

    public static void Main() => StartObjTest();

    #region object test

    public static void StartObjTest()
    {
        List<Employee> items = new List<Employee>();

        for (int i = 0; i < 10000000; i++)
        {
            items.Add(new Employee(i,"name" + i,"lastname" + i,DateTime.Today));
        }

        Test3(items, items.Count-100);
        Test4(items, items.Count - 100);

        Console.Read();
    }


    public static void Test3(List<Employee> items, int idToCheck)
    {

        Stopwatch s = new Stopwatch();
        s.Start();

        bool exists = false;
        foreach (var item in items)
        {
            if (item.id == idToCheck)
            {
                exists = true;
                break;
            }
        }

        Console.WriteLine("Exists=" + exists);
        Console.WriteLine("Time=" + s.ElapsedMilliseconds);

    }

    public static void Test4(List<Employee> items, int idToCheck)
    {

        Stopwatch s = new Stopwatch();
        s.Start();

        bool exists = items.Exists(e => e.id == idToCheck);

        Console.WriteLine("Exists=" + exists);
        Console.WriteLine("Time=" + s.ElapsedMilliseconds);

    }

    #endregion


    #region int test
    public static void StartIntTest()
    {
        List<int> items = new List<int>();

        for (int i = 0; i < 10000000; i++)
        {
            items.Add(i);
        }

        Test1(items, -100);
        Test2(items, -100);

        Console.Read();
    }

    public static void Test1(List<int> items,int itemToCheck)
    {

        Stopwatch s = new Stopwatch();
        s.Start();

        bool exists = false;
        foreach (var item in items)
        {
            if (item == itemToCheck)
            {
                exists = true;
                break;
            }
        }

        Console.WriteLine("Exists=" + exists);
        Console.WriteLine("Time=" + s.ElapsedMilliseconds);

    }

    public static void Test2(List<int> items, int itemToCheck)
    {

        Stopwatch s = new Stopwatch();
        s.Start();

        bool exists = items.Contains(itemToCheck);

        Console.WriteLine("Exists=" + exists);
        Console.WriteLine("Time=" + s.ElapsedMilliseconds);

    }

    #endregion

}

এটি আমি পেয়েছি: অস্তিত্ব = সত্য সময় = 274 অস্তিত্ব = সত্য সময় = 314
PmanAce

2
আপনি কি আগে লিনাকটি করার কথা চিন্তা করেছেন এবং পরে ভবিষ্যদ্বাণী করেছিলেন, তাতে কিছুটা পার্থক্যও হতে পারে
মুহম্মদ মামুর খান

3
মজাদার. আমি Exists=True Time=184 Exists=True Time=135এটি একটি অ্যাপাচি গেমিং ল্যাপটপে পেয়েছি (উইন 10, সি # 7.3)। সংকলিত এবং ডিবাগ মোডে দৌড়ে। আমি যদি পরীক্ষাগুলি উল্টো করি তবে Exists=True Time=158 Exists=True Time=194। আমার ধারণা লিনক আরও অনুকূলিত হয়েছে।
জেমস উইলকিন্স

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

3

এটি আসলে বেশ জটিল প্রশ্ন। লিনক নির্দিষ্ট কিছু কাজ করা খুব সহজ করে তোলে, যদি আপনি নিজে এগুলি প্রয়োগ করেন তবে আপনি হোঁচট খেতে পারেন (উদাঃ লিনক। প্রেরণ ())। এটি বিশেষত PLinq এর ক্ষেত্রে প্রযোজ্য এবং বিশেষত PLinq দ্বারা প্রয়োগ করা সমান্তরাল সমষ্টিতে।

সাধারণভাবে, অভিন্ন কোডের জন্য, ডেলিগেটের অনুরোধের ওভারহেডের কারণে লিনাক ধীর হবে।

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

  1. আপনি ডেটা সঞ্চয় করতে একটি অ্যারে ব্যবহার করেন।
  2. প্রতিটি উপাদান অ্যাক্সেস করতে আপনি লুপের জন্য ব্যবহার করেন (পূর্বে বা লিঙ্কের বিপরীতে)।

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