Nice

english — Tags: , — @ 14:41

Quite party yesterday night! Awesome. Great time spent.

I18n

english — Tags: , — @ 22:11

OpenSolaris i18n team have released i18n/l10n files to translation, What are you waiting for? Go translate! Spanish team is benning its effort!

Working again

english — Tags: , — @ 19:26

I’m running Debian Sid in my laptop and I still don’t know why the Debian package team uses a older ndiswrapper version, current version (1.8), sometimes works and some others crashes the kernel, after downloading most recent version (1.16) and installing, my PCMCIA card is working again :-) ,

root@decadence:~/Documents/Downloads/wireless/WINXP# dmesg |tail
pccard: CardBus card inserted into slot 0
ndiswrapper version 1.16 loaded (preempt=no,smp=no)
ndiswrapper: driver mrv8k51 (Marvell,01/19/2004,2.3.0.3) loaded
PCI: Enabling device 0000:03:00.0 (0000 -> 0002)
ACPI: PCI Interrupt 0000:03:00.0[A] -> Link [LNKA] -> GSI 11 (level, low) -> IRQ 11
PCI: Setting latency timer of device 0000:03:00.0 to 64
ndiswrapper: using irq 11
wlan0: vendor: 'Marvell 802.11 Driver'
wlan0: ndiswrapper ethernet device 00:0c:55:01:40:78 using driver mrv8k51, 11AB:1FA6.5.conf
wlan0: encryption modes supported: WEP; TKIP with WPA

Thinking before redrawing

english — Tags: , , — @ 23:57

Manuel show me some nice samples written by Federico for a better-redrawing, I ported the samples (RulerSlow and RulerFast) to C#. The idea is to improve redrawing in MonoCanvas, I also found two usefull methods Gdk.Window.FreezeUpdates and Gdk.Window.ThawUpdates for avoiding not-needed drawing, in the SWF world their equivalents would be System.Windows.Forms.Control.SuspendLayout and System.Windows.Forms.Control.ResumeLayout.

Notas de desempeño, 2

Uncategorized — Tags: , — @ 22:52

Después de haber hecho lo antes comentado y cambiar las clases por estructuras he notado que (sin la menor duda) se acelara el desempeño, he bajado la respuesta de 6~8 segundos a menos de un segundo, lo cual es algo grandioso, procesar más de 21000 estructuras de aproxidamente 1500 bytes cada una es fantástico, el consumo de CPU es de 1%-3% (hablando de un P4 2.4Ghz), claro que este caso de prueba es “el peor de los casos” y también, aún, hay detalles que podrían ser mejorados, los resultados son excelentes. Durante la recepción utilizo la solución del marshalling+cast, de modo que se hace un cast explícito al tipo de estructura, por ejemplo, suponiendo que tenemos una estructura definida como:

[StructLayout (LayoutKind.Explicit)]
public struct MyStruct
{
[FieldOffset (0)]
public int Integer;

[FieldOffset (4)]
public short Short;
}

Podríamos dentro de alguna parte de nuestra lógica de procesamiento del flujo binario, hacer el cast:

fixed (byte *data = reader.ReadBytes (sizeof (MyStruct))) {
header = *(MyStruct *) data;
}

Donde el flujo lo leemos a través de la variable reader (BinaryReader). Lo más probable es que este proceso se encuentre dentro de un ciclo infinito que se encuentra recibiendo la información del flujo de red. Después de unas pruebas, que hice por simple curiosidad, note algo muy interesante de las formas de obtener el tamaño de una definición de estructura y clase, lo más sorprendente fue que el método propuesto por “Marshal.SizeOf (typeof (MyStruct))“, es más lento, y sin duda es cierto, pues cada ocasión que es llamado se realiza un asignación por la CLR para calcular su tamaño.

repetitions: 1000
iterations: 1.000000e+006

TestSizeOfStatic :      7.773 seconds
TestSizeOf:     2.781 seconds
TestSizeOfMarshal :     50.093 seconds

Debido a que sizeof únicamente sirve para tipos por valor, no es posible aplicar este método a una clase y tendríamos que utilizar Marshal.SizeOf para obtener este tamaño, una solución para no afectar el desempeño y no utilizar siempre la opción no recomendada es agregando una propiedad estática a nuestra clase además de una variable privada estática que mantenga este tamaño, algo como:

[StructLayout (LayoutKind.Sequential)]
public class MyClass
{
public int Integer;
public short Short;

static unsafe MyClass ()
{
_size = Marshal.SizeOf (typeof (MyClass));
}

public static int Size
{
get { return _size; }
}

private static int _size;
}

Además hay que recordar que el overhead de utilizar una clase en comparación a una estructura es mayor. Hay detalles en las clases, al igual que en las estructuras, que deben ser consideradas, el sitio de mono tiene algunos buenos consejos para esto.

This work is licensed under a Creative Commons Attribution-Noncommercial-Share Alike 3.0 Unported License.
(c) 2004-2012 Mario Carrion | powered by WordPress with Barecity