Производительность и горлышко бутылки Zend_Search_Lucene?

Вот еще один ответ, с некоторым сравнением IL. Рассмотрим класс:

public class MyClass
{
    public static void Main()
    {
        // Call the 2 methods
    }

    public void DirectCast(Object obj)
    {
        if ( obj is MyClass)
        { 
            MyClass myclass = (MyClass) obj; 
            Console.WriteLine(obj);
        } 
    } 


    public void UsesAs(object obj) 
    { 
        MyClass myclass = obj as MyClass; 
        if (myclass != null) 
        { 
            Console.WriteLine(obj);
        } 
    }
}

Теперь посмотрим на IL, который создает каждый метод. Даже если операционные коды ничего не значат для вас, вы можете увидеть одно существенное отличие - вызывается isinst, за которым следует castclass в методе DirectCast. Так что два звонка вместо одного в принципе.

.method public hidebysig instance void  DirectCast(object obj) cil managed
{
  // Code size       22 (0x16)
  .maxstack  8
  IL_0000:  ldarg.1
  IL_0001:  isinst     MyClass
  IL_0006:  brfalse.s  IL_0015
  IL_0008:  ldarg.1
  IL_0009:  castclass  MyClass
  IL_000e:  pop
  IL_000f:  ldarg.1
  IL_0010:  call       void [mscorlib]System.Console::WriteLine(object)
  IL_0015:  ret
} // end of method MyClass::DirectCast

.method public hidebysig instance void  UsesAs(object obj) cil managed
{
  // Code size       17 (0x11)
  .maxstack  1
  .locals init (class MyClass V_0)
  IL_0000:  ldarg.1
  IL_0001:  isinst     MyClass
  IL_0006:  stloc.0
  IL_0007:  ldloc.0
  IL_0008:  brfalse.s  IL_0010
  IL_000a:  ldarg.1
  IL_000b:  call       void [mscorlib]System.Console::WriteLine(object)
  IL_0010:  ret
} // end of method MyClass::UsesAs

Ключевое слово isinst по сравнению с каст-классом

В этом блоге есть достойное сравнение между двумя способами. Его резюме таково:

  • В прямом сравнении isinst быстрее, чем castclass (хотя и незначительно)
  • Когда необходимо выполнить проверку, чтобы убедиться, что преобразование прошло успешно, isinst был значительно быстрее чем castclass
  • Не следует использовать комбинацию isinst и castclass, так как это было намного медленнее, чем самое быстрое «безопасное» преобразование (более чем на 12% медленнее)

Я лично всегда использую как потому что он легко читается и рекомендуется командой разработчиков .NET (или Джеффри Рихтером в любом случае)

5
задан omg 23 June 2009 в 17:30
поделиться

1 ответ

Zend_Search_Lucene - это чистая PHP-реализация формата Apache Lucene. В настоящее время (начиная с ZF 1.6) поддерживаемые версии формата индекса Lucene: 1.4 - 2.3. Для получения дополнительной информации о Lucene посетите http://lucene.apache.org/java/docs/ .

Что касается ограничений на размер индекса, размер индекса ограничен 2 ГБ для 32-разрядных версий. битовые платформы и, насколько мне известно, не ограничиваются 64-битными платформами.

Производительность в значительной степени зависит от того, как вы строите свои индексы. Обязательно ознакомьтесь с разделом руководства , который касается производительности .

Кроме того, Luce (инструмент диагностики индексов Lucene) очень полезен при оптимизации производительности и устранении неполадок.

PS Что касается обновления, формат файла индекса Lucene не поддерживает обновление документов. Документы следует удалить и снова добавить в индекс, чтобы эффективно их обновлять. Это верно и для реализации Java.

8
ответ дан 14 December 2019 в 04:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: