3

Google アプリ エンジンから、このコードを最適化するように指示されます。私に何ができるか考えている人はいますか?

def index(request):
    user = users.get_current_user()
    return base.views.render('XXX.html', 
                 dict(profiles=Profile.gql("").fetch(limit=100), user=user))

そして、後で私が行うテンプレートで:

{% for profile in profiles %}
  <a href="/profile/{{profile.user.email}}/"><img src="{{profile.gravatarUrl}}"></a>
  <a href="/profile/{{profile.user.email}}/">{{ profile.user.nickname }}</a>
  <br/>{{ profile.shortDisplay }}

使用される方法は次のとおりです。

def shortDisplay(self):
    return "%s/day; %s/week; %s days" % (self.maxPerDay, self.maxPerWeek, self.days)

def gravatarUrl(self):
    email = self.user.email().lower()
    default = "..."
    gravatar_url = "http://www.gravatar.com/avatar.php?"
    gravatar_url += urllib.urlencode({'gravatar_id':hashlib.md5(email).hexdigest(), 
        'default':default, 'size':"64"})
    return gravatar_url
4

4 に答える 4

6

CPU 使用率が高いのは、リクエストごとに 100 個のエンティティをフェッチするためです。ここにはいくつかのオプションがあります。

  • Profile.all().fetch(100) を使用すると、わずかに速くなり、読みやすくなります。
  • Profile モデルから余分なプロパティを削除します。プロパティごとのかなりのオーバーヘッドの逆シリアル化エンティティがあります。
  • ページごとに表示するユーザー数を減らします。
  • このページの出力を memcache に保存し、可能な限り memcache からレンダリングします。そうすれば、ページを頻繁に生成する必要がないため、CPU 使用率が高くてもそれほど問題になりません。
于 2008-11-18T11:03:59.980 に答える
3

毎回すべてのアイテムに対して md5 ハッシュを実行するのはかなりコストがかかると思います。gravatar のメール ハッシュをどこかに保存することをお勧めします。

于 2008-11-18T09:03:47.493 に答える
1

一見わずかな作業に多くの CPU が使用されているという問題があり、クエリが複数回実行されていないことが判明しました。例えば。私の Django テンプレートでは、post.comments.count を実行してから、post.comments をループしました。これにより、2 つの実行が発生しました。1 つはカウントを取得し、もう 1 つはエンティティを取得します。おっとっと!

また、Guido の Appstats のコピーを入手することもお勧めします。Python では役に立ちませんが、API 呼び出しに費やされた時間 (およびそれらの間の時間 - 多くの場合、どこで Python が遅いかを示す指標となります) を確認することは非常に役立ちます。

ここでライブラリを取得できます: https://sites.google.com/site/appengineappstats/

それについての記事をブログに書きました (いくつかのスクリーンショット付き): http://blog.dantup.com/2010/01/profiling-google-app-engine-with-appstats

アプリ統計 http://blog.dantup.com/pi/appstats_4_thumb.png

于 2010-01-03T18:50:42.397 に答える
0

CPU が多すぎるという警告が表示される場所によって異なります。

ダッシュボードに表示されていますか、おそらくデータストアの CPU が多く、最適化の必要はありません。

リクエストに 10 秒以上かかる場合は、最適化する必要があります。

特定のリクエストが CPU 制限を超えた x.xx であるという定期的なログ警告を受け取る場合は、アプリケーション コードに時間がかかりすぎていることを意味します。そして最適化が必要です。

多くの Django テンプレートは、多くのアプリケーション CPU (50-100 Mcycle) を必要としないことがわかりました。テンプレートのすべてのフィールドが事前計算されている場合。

于 2008-12-27T11:42:45.670 に答える