Как эффективно реализовать сессии в GAE?

Слишком поздно для «ответа», но этот код дает мне время выполнения около 0,75 секунд с обеими строками, обработанными 1 000 000 раз. Разница на этот раз в том, что теперь я не маршалирую объект, а использую указатели.

И на этот раз я возвращаю одну новую строку (String.Substring).

using System;
using System.Diagnostics;
using System.Runtime.InteropServices;

class Program
{
    static void Main(string[] args)
    {
        string testString1 = "1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24";
        string testString2 = "61d2e3f6-bcb7-4cd1-a81e-4f8f497f0da2;0;192.100.0.102:4362;2014-02-14;283;0;354;23;0;;;\"0x8D15A2913C934DE\";Thursday, 19-Jun-14 22:58:10 GMT;";

        Stopwatch sw = new Stopwatch();
        sw.Start();
        for (int i = 1; i < 1000000; i++)
        {
            Delimit(testString1, ',', 22);
            Delimit(testString2, ';', 6);
        }
        sw.Stop();
        Console.WriteLine($"==>{sw.ElapsedMilliseconds}");
        Console.ReadLine();
    }

    static string Delimit(string stringUnderTest, char delimiter, int skipCount)
    {
        const int SIZE_OF_UNICHAR = 2;

        int i = 0;
        int index = 0;
        char c = Char.MinValue;

        GCHandle handle = GCHandle.Alloc(stringUnderTest, GCHandleType.Pinned);
        try
        {
            IntPtr ptr = handle.AddrOfPinnedObject();
            for (i = 0; i < skipCount; i++)
                while ((char)Marshal.ReadByte(ptr, index += SIZE_OF_UNICHAR) != delimiter) ;
            i = index;
            while ((c = (char)Marshal.ReadByte(ptr, i += SIZE_OF_UNICHAR)) != delimiter) ;
        }
        finally
        {
            if (handle.IsAllocated)
                handle.Free();
        }

        return stringUnderTest.Substring((index + SIZE_OF_UNICHAR) >> 1, (i - index - SIZE_OF_UNICHAR) >> 1);
    }
}
12
задан fuentesjr 24 October 2008 в 22:25
поделиться

2 ответа

Я предлагаю проверить (и способствовать) эти три реализации appengine сессий перед развертыванием Вашего собственного:

Ваши опции выглядят хорошо, но выбирающий между ними, вероятно, зависит от размера данных сессии в Вашем приложении.

3
ответ дан 2 December 2019 в 22:52
поделиться

При использовании web2py (версия 1.46 или последний), сессии идут по умолчанию на GAE. Достигнутый следующими тремя строками web2py кода наверху модели лесов:

from gluon.contrib.gql import *
db=GQLDB()
session.connect(request,response,db=db)

Вот демонстрационное действие, которое рассчитывает:

def index():
    session.c=session.c+1 if session.c else 1
    return dict(counter=session.c)
0
ответ дан 2 December 2019 в 22:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: