代码之家  ›  专栏  ›  技术社区  ›  Itay Moav -Malimovka

在需要编程一个算法非常快,我应该做它作为PHP扩展,或其他方式?

  •  2
  • Itay Moav -Malimovka  · 技术社区  · 15 年前

    我的大多数应用程序都是用PHP(前端和后端)编写的。 有一个部分工作得太慢,我需要重写它,可能不是在PHP中。 我将得到以下信息:
    1。最速
    2。发展最快
    三。易于维护。

    我想在cpp中将这段代码重写为一个php扩展,但我可能被锁定在这个解决方案上,错过了一些更简单/更好的解决方案?

    该算法是一种Porterstemmameralgorithm算法,每次运行时都会在几个MB的数据上运行。

    4 回复  |  直到 15 年前
        1
  •  9
  •   gahooa    15 年前

    答案真的取决于它是什么样的过程。

    如果是长时间运行的过程(至少秒) 那么,用C++编写的外部程序可能会非常简单。它没有PHP扩展的复杂性,并且它的稳定性不会影响PHP/Apache。您可以通过管道、共享内存或其他方式进行通信…

    如果是短时间运行的过程(以毫秒计) 然后您很可能需要编写一个PHP扩展。这样就可以非常快速地调用它,几乎不需要每次调用的开销。

    另一种可能是自定义服务器 它在一个Unix域套接字上监听,并在PHP请求信息时快速响应PHP。然后,每次调用的开销基本上就是创建一个套接字(不错)。服务器可以是任何语言(C、C++、Python、Erlang等等),客户端可以是一个使用SokKy**()函数的50行PHP类。


    在做出这个决定之前,需要评估很多信息。在进入真正紧密的循环或数千次重复的函数调用之前,PHP通常不会显示速度慢。换句话说,HTTP请求的开销和网络延迟通常使PHP延迟无关紧要(除非以上适用)

    • 也许有更好的方法用PHP编写它?
    • 你有数据库绑定吗?
    • 它是CPU绑定、网络绑定还是IO绑定?
    • 是否可以缓存结果?
    • 是否已经存在一个库来进行重提升?

    通过提交自定义的PHP扩展,您可以显著地增加维护它所需的知识基础(甚至高于C++)。但它是一个 必要时的最佳选择 .

    请随时更新您的问题与更多的细节,我相信堆栈溢出将乐于帮助。

        2
  •  3
  •   gahooa    15 年前

    建议

    PorterstemmerAlgorithm有一个 C 实施可在 http://tartarus.org/~martin/PorterStemmer/c.txt

    将这个C程序与数据源联系起来并使其成为独立的可执行文件应该是一件容易的事情。然后,您只需使用一个proc函数从php调用它,例如 proc_open()

    除非每个php请求需要多次调用这个程序,否则这种方法应该可以节省构建和集成php扩展的工作量,更不用说(在c中)已经完成了艰苦的工作。

        3
  •  0
  •   Franklin    15 年前

    我不知道porterstemmarelgorithm是什么。但是,如果可以使进程并行运行并收集信息,可以查看在Java中容易实现的并行运行过程。不确定如何在PHP中调用它,但肯定是可维护的。

    您可以看看这个框架。看起来很容易实现

    https://computefarm.dev.java.net/

    当做, 富兰克林。

        4
  •  0
  •   Jim OHalloran    15 年前

    如果出于速度的原因,你绝对需要用另一种语言重写,那么我认为gahooa的答案很好地涵盖了选项。但是,在执行此操作之前,是否确实已经尽了一切努力提高了PHP实现的性能?

    1. 缓存输出在您的情况下可行吗?你能不能先运行一次算法,然后缓存输出,而不是每次页面加载?
    2. 您是否尝试分析代码以确保没有不必要的工作(内部循环中的db查询等)正在完成?xdebug可以在这里提供帮助。
    3. 是否有其他可用的词干算法可以在数据集上更好地执行?