另一方面,我们的软件架构师决定将未打包的数据格式化为非常可读的 XML 文档,并将其存储在数据库中(而不是将每个字段存储在相应的列中)。他们的想法是“ XML 是未来”、“磁盘空间很便宜”和“处理器很便宜”,因此没有必要对任何东西进行优化。结果是我们的16字节的数据包被转换成2kB 的文档存储在一个列中,甚至对于简单的查询,我们必须在内存中加载兆字节的 XML 文档!我们每秒收到超过50个数据包,所以你可以想象性能变得多么糟糕(顺便说一句,公司破产了)。
if (myObj) { //or its evil cousin, if (myObj != null) {
label.text = myObj.value;
// we know label exists because it has already been
// checked in a big if block somewhere at the top
}
我能想到的最糟糕的例子是我公司的一个内部数据库,其中包含所有员工的信息。它每晚都会从人力资源部获得更新,上面还有一个 ASP.NET Web 服务。许多其他应用程序使用 Web 服务来填充诸如搜索/下拉字段之类的内容。
悲观的是,开发人员认为对 Web 服务的重复调用太慢,无法进行重复的 SQL 查询。那他做了什么?应用程序启动事件读入整个数据库,并将其全部转换为内存中的对象,无限期存储,直到应用程序池被回收。这段代码非常慢,加载不到2000名员工需要15分钟。如果您在白天无意中回收了应用程序池,可能需要30分钟或更长时间,因为每个 Web 服务请求将启动多个并发重载。因为这个原因,新员工在他们的账户创建的第一天不会出现在数据库中,因此在他们创建的头几天不能访问大多数内部应用程序,无所事事。
我有一个同事,他试图智胜我们的 C 编译器的优化器和例程重写代码,只有他可以阅读。他最喜欢的技巧之一是改变一个可读的方法,比如(编写一些代码) :
int some_method(int input1, int input2) {
int x;
if (input1 == -1) {
return 0;
}
if (input1 == input2) {
return input1;
}
... a long expression here ...
return x;
}
变成这样:
int some_method() {
return (input == -1) ? 0 : (input1 == input2) ? input 1 :
... a long expression ...
... a long expression ...
... a long expression ...
}
procedure sort(string[] values, string direction)
begin
while not sorted do
begin
for every value in values
begin
if direction="Ascending" then
begin
... swap values in ascending order
end
else if direction="Descending" then
begin
... swap values in descending order
end
end;
end;
end;