我一直在对我在Perl中编写的框架的性能进行基准测试,并且我的每秒请求数比现有代码库减少了50%(一些命中率是可以理解的,因为我们将从程序意义上的代码转换为OOP MVC框架).
应用程序在mod_perl下运行,我已将Moose和我的所有框架代码添加到startup.pl脚本中,该脚本本身使我的请求每秒加倍.我希望进一步增强这个数字,使其尽可能接近现有数量.我们认为这是过早的优化,但是我想解决一些明显的低效问题,看看它如何影响性能.
像大多数框架一样,我有一个配置文件和一个调度程序.配置部分由Config :: General处理,因此需要一些IO和解析来将我的配置文件加载到应用程序中.我在这里看到的最大问题是我正在为每一个请求进行此操作!
在我的应用程序上运行Devel :: Dprof指向Config :: General :: BEGIN和一堆相关的IO模块作为不是Moose的主要慢点之一.所以我想要做的事情,以及事后更有意义的是利用mod_perl的持久性和startup.pl编译的东西,只做一次加载配置文件的工作 - 当服务器启动时.
问题是我不太熟悉它是如何工作的.
目前每个项目都有一个非常精简的PerlHandler引导类,如下所示:
use MyApp;
MyApp->new(config_file => '/path/to/site.config')->run();
Run Code Online (Sandbox Code Playgroud)
MyApp.pm继承自框架Project模块,该模块具有以下代码:
my $config = Config::General->new(
-ConfigFile => $self->config_file,
-InterPolateVars => 1,
);
$self->config({$config->getall});
Run Code Online (Sandbox Code Playgroud)
要仅在编译时执行此操作,我的引导程序和项目基础模块都必须更改(我认为),但我不确定要进行哪些更改并仍然保持代码良好和精益.任何人都能指出我在正确的方向吗?
UPDATE
我在每个项目模块方法中尝试了BEGIN BLOCK,如ysth在他的回答中所描述的那样.所以我现在有:
package MyApp::bootstrap;
use MyApp;
my $config;
BEGIN
{
$config = {Config::General->new(...)->getall};
}
sub handler { ..etc.
MyApp->new(config => $config)->run();
Run Code Online (Sandbox Code Playgroud)
这个快速变化让我每秒的请求增加了50%,证实了我的想法,配置文件是一个值得修复的主要瓶颈.我们的crotchety旧开发机器上的基准数字是60rps,我的框架已经从30rps变为45rps单独进行此更改.对于那些说Moose很慢并且编译时间很短的人来说......在启动时编译我所有的Moose代码时我得到了相同的(50%)增加,就像我预先编译我的配置文件一样.
我现在唯一的问题是这违反了DRY主体,因为相同的Config :: General->新代码在每个BEGIN块中,只有配置文件的路径不同.我有一些不同的策略来限制这个,但我只是想发布这个变化的结果.
我正在阅读Jeff Atwood关于Behold WordPress,CPU驱逐舰的博客,并看到那里有很多人认为每页加载20个SQL查询很多.现在,对于具有自动建议,自动刷新数据,自定义页面和厨房水槽的高动态页面,每页的平均查询量是多少?
举一个简单的例子,Amazon.com几乎可以根据他们认为我会购买的东西来定制我的主页.对我来说,这看起来并不只是对首页使用5个或更少的查询.
我仍然是数据库的新手,所以请告诉我,我是否遗漏了一些明显的东西.
是否可以读取Apache中.htaccess文件中的php $ _SESSION数组中的数据?所以说我有以下内容:
$_SESSION['foo'] = 'bar';
Run Code Online (Sandbox Code Playgroud)
我可以在.htaccess做类似的事情:
RewriteRule bla.png folder/{the php session var foo}/file.png
Run Code Online (Sandbox Code Playgroud)
那可能吗?
我已经有了一个可行的解决方法,但如果可行的话,它会更好.
问题: C盘上有一堆指向J:盘的.lnk文件,但是J:盘不见了,取而代之的是P:盘。人们已经采取了各种技巧来让 .lnk 文件仍然可以工作,但它变得很烦人,是时候修复这些问题了。
使用 Ruby、Python、WSH.JScript 或 Perl,您可以迭代 .lnk 文件的整个目录树并更改它们,使它们指向 p:/* 而不是 j:/* 吗?你会怎样做呢?
注意:这对我来说并不是完全未知,但我还是提出了这个问题,因为到目前为止我发现的用于管理 .lnk 文件的 API 似乎太麻烦了,无法成为最知名的方法。这是那些绝望的“必须有更好的方法”类型的问题之一。
我正在使用.net的PrintPreviewDialog,每当它生成预览时,它会在后台锁定我的GUI并使其看起来像已经崩溃直到预览完成.看到弹出的.net页面进度窗口不是一个对话框,可以选择背景,然后以半绘制的锁定方式进入前面.当用户单击预览对话框上的实际"打印"按钮时,以及刚运行PrintDocument.Print()时,也会发生这种情况.有一种简单的方法可以修改以下代码,以便在用户等待.net绘制打印页面时停止GUI挂起:
//just showing a preview, hangs up background GUI on generating the preview
// and when user prints straight from the preview
this.printPreviewDialog.ShowDialog(this);
//just trying to print a .net PrintDocument class, GUI hangs in background
// when .net is drawing the pages
this.printDocument.Print();
Run Code Online (Sandbox Code Playgroud) 我正在编写的代码从操作系统收集性能数据(例如CPU使用率).我想知道我是否应该费心去尝试对这段代码进行单元测试.似乎要对单元测试代码进行单元化,您需要设计被隔离到单元中的代码.我的代码与操作系统紧密相关,但是如果我将与操作系统交互的代码隔离到一个我可以模拟的包装器中,那么就没有太多可以测试了.
所以,我认为单元测试在这里不起作用.我误解了如何使用单元测试吗?我阅读的博客中的每个人都说他们很好,但我不确定它们对所有应用领域都有用.
例如,如果我将此代码移动到不同版本的操作系统,我肯定会有很多错误,但我看不出单元测试如何帮助我找到它们.
你找到了同样的问题吗?我是否应该尝试为此编写单元测试?
是否可以为Outlook 2003或更高版本创建不引用外部图像的HTML电子邮件签名?
也就是说,使用那些特殊的"cid"引用,但将图像本身嵌入签名中而不是文件系统或网络上.
这适用于基于用户的各种输入生成"标准"电子邮件签名的Web应用程序.到目前为止,它只使用一个"嵌入式"图像工作得很好.但是新功能需要添加多个微小图像.
让用户将一个电子邮件签名模板和一个图像保存到用户的计算机上是我想要用户的限制.但是,在我看来,强迫用户保存多个图像似乎正在推动一些事情.
所以我的问题是试图嵌入图像而不必先为多个下载的用户带来不便.
我正在使用Python 2.6中的新多处理模块进行实验.我正在创建几个进程,每个进程都有自己的multiprocessor.JoinableQueue实例.每个进程产生一个或多个工作线程(threading.Thread的子类),它们共享JoinableQueue实例(通过每个Thread的__init__方法传入).它似乎通常工作,但偶尔和不可预测的失败,出现以下错误:
File "C:\Documents and Settings\Brian\Desktop\testscript.py", line 49, in run
self.queue.task_done()
File "C:\Python26\lib\multiprocessing\queues.py", line 293, in task_done
raise ValueError('task_done() called too many times')
ValueError: task_done() called too many times
Run Code Online (Sandbox Code Playgroud)
我的队列get()和task_done()调用是在彼此之后,因此它们应该是相等的.有趣的是,这似乎只有在get()和task_done()之间完成的工作非常快时才会发生.插入一个小time.sleep(0.01)似乎可以缓解这个问题.
有什么想法发生了什么?我可以使用带有线程的多处理器队列而不是更传统的(Queue.Queue)吗?
谢谢!
布赖恩
有没有人知道网页上的参考链接,其中包含一个示例英文字典单词脚本,可以用来填充SQL Server中的字典表?
我可以处理.txt或.csv文件,或类似的东西.
或者,我正在为我的网络应用程序添加自定义拼写检查功能......但我不想集成标准组件.如果有关于构建字典单词检查器的良好参考(有样本),我也会喜欢它!
.net ×2
c# ×2
sql ×2
.htaccess ×1
apache ×1
dictionary ×1
exception ×1
lnk ×1
mod-perl ×1
optimization ×1
outlook ×1
performance ×1
perl ×1
php ×1
printing ×1
python ×1
python-2.6 ×1
scripting ×1
session ×1
shortcut ×1
signature ×1
symlink ×1
unit-testing ×1
windows ×1