我如何说服同行认为算法很重要?

pyo*_*yon 3 algorithm peer

我的同行正在撰写一份报告,显示我们小型咨询公司每位员工的每周(周日至周六)预付款.他编写了一段代码,显示了与目标周中的日期相对应的列.他的算法如下:

  1. 获取该月第一天的哪一天.如果是星期天,将标志设置为零; 否则,将其设置为1.
  2. 整个月的所有日子都在迭代.如果是星期天,请递增旗帜.然后,如果标志的值等于要显示的周,则显示与当天相对应的列; 否则,隐藏列.

当然,该标志表示当前周是什么.

我建议另一种算法:

  1. 获取该月的哪几天是指定周的第一天(F)和最后一天(L).例如,2009年10月的第一周从星期二的1日开始,到星期六的3日结束.
  2. 遍历对应于第1天到第F-1天的列,并隐藏它们.
  3. 遍历对应于天F到L的列,并显示它们.
  4. 遍历对应于天L + 1到DaysOfMonth的列,并隐藏它们.

我的算法中的"困难"部分是第1部分.我的意思是"难以",因为"难以理解",因为这样做的算法复杂性是不变的.我的算法具有更紧密的循环优势.我的同行循环对每月的每一天进行比较.我没有.

这是一个小例子,你可能会说这里的过度优化有点过于偏执.但是当我们编写实际的性能关键代码时,他的编程风格并没有改变.

他的代码也充满了这些测试:

/* doSomething() doesn't change the state of the relevant variables. */
if (condition)
{
    flag++;
    if (flag > test)
        doSomething();
}
else
    if (flag >= test)
        doSomething();
Run Code Online (Sandbox Code Playgroud)

当然,当它可以这样做:

if (flag >= test);
    doSomething();
if (condition)
    flag++;
Run Code Online (Sandbox Code Playgroud)

我该怎么办?!?!?!

编辑:我更正了代码示例中的比较.

Jor*_*ren 10

我认为你的朋友有正确的想法.采用对算法来说明显正确的算法需要花费一个小时来解释,但是没有特定的性能目标,速度会更快.

如果您有特定的性能要求,例如"代码需要能够在机器X上的200微秒内在未来十年内为所有月份提供正确的结果",并且更简单的代码不符合要求,那么您可能会考虑使用版.

(您发布的代码示例确实在您的方式上更好,因为它不那么复杂.)


ctf*_*ord 5

根据您的描述,我不确定我是否同意您的同事.这里的关键问题是这段代码是否是性能瓶颈.

为了说服切换到您的算法,您必须分析有问题的应用程序,并告诉我这段代码对性能至关重要.然后进行更改并再次进行配置.这样你就有了比较客观基础.

如果两种算法之间存在有意义的差异,那么你们两个可以讨论是否值得进行切换.

如果您担心Web应用程序的页面加载时间,请记住高性能网站的课程和Yahoo性能指南 - 如何处理CSS,javascript和缓存将比优化运行在您的算法上的算法产生更大的影响服务器.

在没有测量的情况下倡导优化与忽略天真算法的性能影响一样危险.