سؤال

إعادة: http://msdn.microsoft.com/en-us/library/system.io.file.exist.aspx.

هل يعرف أحد إذا كانت هذه عملية بطيئة أو قفل بشكل خاص يمكن أن تؤثر على أداء الخادم في بيئة كبيرة؟

هل كانت مفيدة؟

المحلول

قفل لا. بطيئة، يعتمد على ما تقارنه به. إنه رخيص إلى حد ما بقدر ما يذهب I / O، لكن I / O بطيء عموما بشكل عام مقارنة بالعمليات الأخرى. لذلك، إذا كان يجب عليك استخدامه، فلن تؤذي سيئة للغاية. ومع ذلك، سأحاول عدم استدعاء المزيد من أوقات أكثر مما هو ضروري حقا! :-)

نصائح أخرى

في الحوسبة، لا يوجد شيء في الواقع مثل مثل "عملية باهظة الثمن"، إلا إذا كنت تفكر في ما هو مكلف فيما يتعلق.

على سبيل المثال، في العالم الحقيقي، سيكون 2.000.000 دولار للكائن باهظ الثمن؟ ماذا لو كان سعر جزر البهاما؟ هل سيكون مكلفا إذن؟ ماذا عن الكرتون من الحليب؟ هل هذا مكلف؟

الشيء الذي تحتاجه للنظر فيه هو إذا File.Exists باهظة الثمن من حيث العملية الشاملة التي تنوي القيام بها، وما إذا كان لديك بالفعل أي بدائل.

إذا لم يكن لديك أي بدائل، فهل تهم ما إذا كانت مكلفة أم لا؟

على سبيل المثال، إذا قمت بتحديد 1 إذا كان الملف موجودا، ثم إذا فعل ذلك، فأنت تقوم بتحميله، وقضاء ساعة في معالجة ذلك، ثم أود أن أفترض أنه لن يعتبر مكلفا.

ومع ذلك، إذا قمت بالاتصال به 10 مرات في حلقة واحدة، لمعرفة ما إذا كان الملف موجودا، ثم إذا كان الأمر كذلك، فما عليك سوى زيادة عدد، فقد يكون من أغلى عملية واحدة تقوم بها هناك.

الطريقة الوحيدة التي يمكنك من خلالها أن تعرف بالتأكيد هي قياس المدة التي تستغرق هذه الطريقة، مقارنة بما أنت عليه في نفس العملية.

في عام 2016، لا يبدو أنه مكلف للغاية ويبدو أنه لا يوجد فرق حقيقي File.Exists و PathFileExists (لماذا الملف الشخصي () أبطأ بكثير عند عدم وجود الملف؟). الفرق الوحيد الذي يمكنني قياسه هو أنه أسرع للتحقق من وجود ملف غير موجود ثم واحد موجود:

(تم اختباره على SSD)

[DllImport("Shlwapi.dll", SetLastError = true, CharSet = CharSet.Auto)]
private extern static bool PathFileExists(StringBuilder path);

void Main()
{
    var sw = Stopwatch.StartNew();
    for (int i = 0; i < 10000; i++)
    {
        File.Exists(@"c:\Home\Temp\test_.log");
    }
    sw.Stop();
    sw.Dump("File.Exists = false");

    sw = Stopwatch.StartNew();
    for (int i = 0; i < 10000; i++)
    {
        File.Exists(@"c:\Home\Temp\test.log");
    }
    sw.Stop();
    sw.Dump("File.Exists = true");

    var sb = new StringBuilder(@"c:\Home\Temp\test_.log");
    sw = Stopwatch.StartNew();
    for (int i = 0; i < 10000; i++)
    {
        PathFileExists(sb);
    }
    sw.Stop();
    sw.Dump("PathFileExists = false");

    sb = new StringBuilder(@"c:\Home\Temp\test.log");
    sw = Stopwatch.StartNew();
    for (int i = 0; i < 10000; i++)
    {
        PathFileExists(sb);
    }
    sw.Stop();
    sw.Dump("PathFileExists = true");

}

Results

لا أعتقد أنه (يتم تحسين عمليات الملفات بشكل كبير وتتخشى مؤقتا على معظم عمليات نظام التشغيل) ومعظم العمليات الأخرى من المرجح أن تكون الجناة هنا (المقابس، وصول DB، المعالجة العامة، إلخ). ولكن، كالعادة، فإن أفضل طريقة هي في الواقع التطبيق الخاص بك ومعرفة ما إذا كان نقطة ساخنة.

أفضل سيكون لتشغيل بعض الاختبارات في بيئتك. لدي تطبيق يمكن أن يفعله 10،000+ في الثانية الواحدة دون الفواق إلى أنظمتي. أنا أعتبر أن سريع جدا.

File.Exisits مع kernel32.dll findfirstfile handler مفتوحة إلى الملف. إذا كان المقبض الناتج غير صالح، فإنه يعرض خطأ. إذا كان ساري المفعول، فقم بملء بنية البيانات باستخدام جميع الأشياء مثل LestAccessTime، وإنشاء حجم الملف وما إلى ذلك. ثم العودة صحيح. لا شيء حظر.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top