|
Página 1 de 2
|
¿ Qué Ocupa Más ?. ¿ Array De Cadena O Una Cadena ?
Autor |
Mensaje |
Shell
Analista Programador
Registrado: Marzo 2010
Mensajes: 5278
Edad: 53 Ubicación: Al otro lado de la pantalla
|
¿ Qué Ocupa Más ?. ¿ Array De Cadena O Una Cadena ?
Hola!.
Si tuviera la posibilidad de tener tanto un array como en una variable de cadena los mismos datos.
¿ Qué ocuparía más ?. ¿ El array o la cadena ?.
¿ Qué ocupa más ?.
Ó
Por lo que parece tenemos cuatro cadenas y en la otra es solo una.
No podemos olvidar la longitud de las cuatro cadenas.
¿ Qué hubieses preferido tú ?.
Saludos
=================== Gambas Básico
"No es un bug, es una característica no documentada"
última edición por Shell el Lunes, 23 Noviembre 2015, 14:04; editado 2 veces
|
#1 Lunes, 23 Noviembre 2015, 14:03 |
|
|
shordi
Analista Programador
Registrado: Septiembre 2009
Mensajes: 4982
Edad: 64 Ubicación: Albacete
|
Re: ¿ Qué Ocupa Más ?. ¿ Array De Cadena O Una Cadena ?
Supongo que el array ocupa más, más punteros y más celdas de memoria vacías, pero en realidad no tengo ni pajolera idea. Vuott sabe de eso, seguro.
=================== No podemos regresar
|
#2 Lunes, 23 Noviembre 2015, 17:50 |
|
|
jsbsan
Analista Programador
Registrado: Septiembre 2009
Mensajes: 4175
Edad: 50 Ubicación: dos hermanas, sevilla
|
Re: ¿ Qué Ocupa Más ?. ¿ Array De Cadena O Una Cadena ?
Yo pienso igual que Shordi,,, seguro que ocupa más un array (sea cual sea el lenguaje de programación que usemos)
|
#3 Lunes, 23 Noviembre 2015, 18:15 |
|
|
Shell
Analista Programador
Registrado: Marzo 2010
Mensajes: 5278
Edad: 53 Ubicación: Al otro lado de la pantalla
|
Re: ¿ Qué Ocupa Más ?. ¿ Array De Cadena O Una Cadena ?
Estos dos ejemplos hacen lo mismo, pero en uno usa un array y en el otro usa una cadena.
Con cadena:
Con un array:
La salida de ambos es:
Citar:
ABCD
ABC
¿ Cuál sera más rápido ?. TicTacTicTac...
Según el perfilado:
Usando cadenas: 45uS, 67uS, 68uS, 50uS, 48uS. Un media de: 55,6 uS
Usando arrays: 60uS, 60uS, 59uS, 59uS, 59uS. Una media de: 59,4 uS . Debería ser algo más.
Los tamaños generados para crear el ejecutable es el mismo. 1K1
Saludos
=================== Gambas Básico
"No es un bug, es una característica no documentada"
|
#4 Lunes, 23 Noviembre 2015, 19:58 |
|
|
jguardon
Administrador
Registrado: Septiembre 2009
Mensajes: 2708
Edad: 57 Ubicación: Granada
|
Re: ¿ Qué Ocupa Más ?. ¿ Array De Cadena O Una Cadena ?
¿Qué tal esto?
http://gambaswiki.org/wiki/comp/gb/object/sizeof?l=es
Puede que te saque de muchas dudas
Saludos
=================== Jesús Guardón
Por favor, usemos el corrector ortográfico antes de pulsar el botón "Enviar".
"uo ǝs ʇɐu pıɟıɔıן ɐdɹǝupǝɹ ɐ dɹoƃɹɐɯɐɹ, soןo ɥɐʎ bnǝ dɹodouǝɹsǝןo"
|
#5 Lunes, 23 Noviembre 2015, 20:13 |
|
|
Shell
Analista Programador
Registrado: Marzo 2010
Mensajes: 5278
Edad: 53 Ubicación: Al otro lado de la pantalla
|
Re: ¿ Qué Ocupa Más ?. ¿ Array De Cadena O Una Cadena ?
Jesús:
Interesante.
Con el array bien, con la cadena no se puede..
Si cambio el tipo y creo una estructura ya no sería una cadena, seria un objeto.
De todas formas esto de Object.Sizeof tiene que ser para pruebas de laboratorios y de programadores como Sheldon Cooper.
Saludos
=================== Gambas Básico
"No es un bug, es una característica no documentada"
|
#6 Lunes, 23 Noviembre 2015, 21:21 |
|
|
vuott
Analista Programador
Registrado: Agosto 2013
Mensajes: 2086
Edad: 60 Ubicación:
|
Re: ¿ Qué Ocupa Más ?. ¿ Array De Cadena O Una Cadena ?
Con el array bien
..... Object.Sizeof
...y cuanto es el resultado de un array de cadenas usando Object.SizeOf() ?
última edición por vuott el Martes, 24 Noviembre 2015, 02:18; editado 1 vez
|
#7 Martes, 24 Noviembre 2015, 02:17 |
|
|
Shell
Analista Programador
Registrado: Marzo 2010
Mensajes: 5278
Edad: 53 Ubicación: Al otro lado de la pantalla
|
Re: ¿ Qué Ocupa Más ?. ¿ Array De Cadena O Una Cadena ?
Vuott:
Con el array bien
..... Object.Sizeof
...y cuanto es el resultado de un array de cadenas usando Object.SizeOf() ?
Del array "valores" en concreto es 24 bytes. incluso vacío mide 24 bytes.
Saludos
=================== Gambas Básico
"No es un bug, es una característica no documentada"
última edición por Shell el Martes, 24 Noviembre 2015, 10:24; editado 1 vez
|
#8 Martes, 24 Noviembre 2015, 10:24 |
|
|
vuott
Analista Programador
Registrado: Agosto 2013
Mensajes: 2086
Edad: 60 Ubicación:
|
Re: ¿ Qué Ocupa Más ?. ¿ Array De Cadena O Una Cadena ?
incluso vacío mide 24 bytes.
Pues esto es una confirmación que en gambas la creación de un objeto significa ipso facto la ocupación de memoria.
...es 24 bytes.
Recuerdo que tu tienes un sistema de 32-bit, el mi resultado, que tengo un sistema de 64-bit, es 40.
Este numero no cambia al cambiar del tipo de valor del array. Es decir que el resultado 24-40 es tal si el array es de tipo String[ ] o de tipo Byte[ ] o otro tipo.
En efecto, aquel valor se refiere a la area de memoria ocupada por el objeto "array", cualquiera sea su tipo.
Claro, pero, que al aumentar de los elementos de un array, se incrementa tambien la memoria ocupada por el almacenamiento de los datos contenido en cada elemento. La area de memoria del objeto no es la misma de la area de memoria donde son almacenados los datos del array: conexas, pero distintas.
De una análisis de esta area de memoria del objeto parece que esta sea constituida en parte por la Estructura struct OBJECT (contenida en el archivo header: gbx_object.h) y en parte por la Estructura struct CARRAY (contenida en el archivo header: gbx_c_array.h), y en particular por:
- un Puntero a la Estructura " struct _CLASS", contenida en el archivo header gbx_class.h;
- una variable de tipo intptr_t;
- dos variables de tipo Integer;
- una variable de tipo TYPE;
- un Puntero de tipo Byte.
Bueno, asì tenemos:
struct CLASS *class; --> 4 byte (32bit) - 8 byte (64-bit) - Dice la clase de pertenencia del objeto (en este caso un "Array")
intptr_t ref; --> 4 (32bit) - 8 (64-bit) - (no importante)
int size; --> 4 (32bit) - 4 (64-bit) - Dice la cantidad de memoria que el tipo de dato del array ocupa.
int count; --> 4 (32bit) - 4 (64-bit) - Dice la cantidad de elementos contenidos por el array (es decir: array.Count)
TYPE type; --> 4 (32bit) - 8 (64-bit) - Dice el tipo de dato, al que la clase pertenece.
void *data; --> 4 (32bit) - 8 (64-bit) - Contiene los datos contenidos por el array.
La suma es 24 con un sistema de 32-bit y 40 con un sistema de 64-bit.
Podemos ver en gambas lo que he dicho (ejemplo solo para sistemas de 64 bit ! ):
Public Sub Main()
Dim vacuum As New Byte[]
Dim bb As Byte[] = [1, 2, 3, 4, 5, 6, 7]
Dim p1, p2, p3 As Pointer
Dim i As Integer
Dim st As Stream
Dim b As Byte
Print "=== Inspectio in vectore obiecto ===\n"
Print "Dimensión del array vacío: "; Object.SizeOf(vacuum) ' Obtiene la dimensión del array vacío
Print "Dimensión del array NO vacío: "; Object.SizeOf(bb) ' Obtiene la dimensión del array NO vacío
Print
' Entramos en la Estructura "OBJECT" del nuestro Array:
p1 = Object.Address(bb)
If IsNull(p1) Then Error.Raise("Error tremendus !")
st = Memory p1 For Read ' Muestra todos los byte de la area de memoria ocupada por el objeto "array"
For i = 0 To 39
Read #st, b
Print i, Hex(b, 2)
Next
st.Close
' Entramos en la Estructura "_CLASS":
p2 = Pointer@(p1)
If IsNull(p2) Then Error.Raise("Error tremendus !")
Print "\n---", Int@(p2 + 12) ' Numero de objetos instanciados con la Classe (en este caso Array)
Print "---", String@(Pointer@(p2 + 24)) ' Nombre de la Classe
Print "---", Int@(p2 + 152) ' Tambien aqui el tipo de datos de el array
Print
' Ahora volvemos a la Estructura "OBJECT":
Print "size: "; Int@(p1 + 16) ' "size" -> la dimensión del tipo de dato de el array
Print "count: "; Int@(p1 + 20) ' "count" -> la cantidad de elementos constituentes el array
Print "type: "; Long@(p1 + 24) ' "type" -> el tipo de datos de el array (Para saber a cuál tipo de dato corresponde el número en este miembro, hace falta ver los "gambas datatypes identifiers" en el file header "gambas.h")
' Entramos en la area de memoria apuntada por el miembro " * data" (donde son almacenados los datos contenidos de los elementos del Array):
p3 = Pointer@(p1 + 32)
If IsNull(p3) Then Error.Raise("Error tremendus !")
Print "Datos en el array:"
For i = 0 To bb.Max
Print Byte@(p3 + i),
Next
End
última edición por vuott el Miercoles, 25 Noviembre 2015, 11:36; editado 23 veces
|
#9 Martes, 24 Noviembre 2015, 17:27 |
|
|
vuott
Analista Programador
Registrado: Agosto 2013
Mensajes: 2086
Edad: 60 Ubicación:
|
Re: ¿ Qué Ocupa Más ?. ¿ Array De Cadena O Una Cadena ?
última edición por vuott el Martes, 24 Noviembre 2015, 18:05; editado 2 veces
|
#10 Martes, 24 Noviembre 2015, 17:41 |
|
|
|
Temas parecidos
Temas parecidos
|
Página 1 de 2
|
Usuarios navegando en este tema: 0 registrados, 0 ocultos y 1 invitado Usuarios registrados conectados: Ninguno
|
No puede crear mensajes No puede responder temas No puede editar sus mensajes No puede borrar sus mensajes No puede votar en encuestas No puede adjuntar archivos Puede descargar archivos No puede publicar eventos en el calendario
|
|
|
|
|