Diskusi ini masih dibatasi pada sistem operasi windows 32bit.
1. Apakah ini adalah salah satu cara agar prosesnya lebih cepat?
Function FileLen(PathName As String) As Long
>> Betul.
Jadi, prinsip dasarnya, datatype yang membutuhkan alokasi 32bit untuk 1
datanya,maka itu lebih cepat diproses daripada yang tidak 32bit, yang
sejenis. Artinya, datatype untuk bilangan bulat tidak bisa dibandingkan
dengan datatype untuk bilangan approximate. Tetapi sesama datatype bilangan
bulat bisa dibandingkan, yaitu long (pada VB6 32bit) lebih cepat diproses
dibanding dengan integer (pada vb6 32bit). Begitu pula dengan datatype
bilangan approximate, bahwa single (4 byte) lebih cepat dibanding double (8
byte).
Sebagian besar fungsi Win32API menggunakan datatype Long, karena Windows
bekerja 32Bit.
Jadi, didalam programming harus terlebih dahulu diadakan pemisahan datatype
dengan jelas. Mana yang untuk proses dan mana yang menyimpan data untuk
berinteraksi dengan media seperti file dan sebagainya. Kadang proses
konversi datatype dinilai memperlambat kerja. Tentu saja hal itu tidak
sepenuhnya salah atau benar, semua tergantung intensitas pemakaiannya dan
asal si data. Satu hal yang menjadi perhatian,ketika data asal berasal dari
suatu database yang tersusun secara tetap dalam datatype yang mengutamakan
kecepatan table scan. Hal ini menuntut penyimpanan yang seringkas mungkin
sehingga proses scan data bisa lebih cepat. Tentu didalamnya sana akan ada
proses konversi sementara ke datatype yang lebih sesuai untuk performa
kerja. Itu juga akan tampak pada pemrosesan terhadap sebuah table yang
memiliki banyak records tidak lebih lambat linear terhadap table yang lebih
sedikit records.
2. mengatur alokasi memori untuk menyimpan matrix?
>> jika data bertype approximate, maka single lebih sesuai untuk proses.
Untungnya lagi, Excel (cells berbasis datatype double) selalu mengadakan
konversi ke datatype yang digunakan dalam VBA. Misal, pada suatu cell berisi
nilai 45.6789, ketika di vba telah dideklarasikan variable l sebagai Long,
maka l=range("itu") akan langsung menghasilkan angka hasil clng(nilai
range).
Matrix adalah suatu array terstruktur, minimal, selalu berisi bilangan
dengan dimensi yang tetap sepanjang suatu proses terhadap matrix tersebut.
Operasi matrix harus selalu disimpan ke matrix lain jika terjadi berubahnya
dimensi. Hukum inilah yang membuat array dalam VB begitu memegang peranan
penting dalam mengolah matrix. Bayangkan saja, setiap dimensi dibatasi
dengan jumlah sebesar batas datatype Long [equal (2^64)-1]. Jumlah
dimensinya, saya juga belum pernah coba, kira-kira mungkin masih bisa sampai
60 dimensi. Yang pasti yang pernah saya temui adalah seorang teman yang
kuliah dulu pernah buat untuk tugas akhirnya dengan matrix berdimensi 2048 x
26 dan oke-oke saja. (saya heran juga, apa ya yang dihitung,katanya ada
hubungannya dengan gate dalam processor gitu). embuh lah gak mudeng.
Pada VB classic (VB6) termasuk sampai VB6.5 yang digunakan oleh Excel 2007,
default base option array adalah 0. Penggeseran ke base option 1 katanya
bisa memperlambat kerja, tetapi saya sendiri belum membuktikannya, karena
selalu menggunakan base 0 pada aplikasi yang dibangun dengan VB6. Yang
jelas, saya lebih suka mudahnya saja.
Operasi matrix sama saja dengan memaksimalkan loop. Berarti proses yang
penting.
3. Limit pada Excel function MMult atau MInverse
>> Betul.
Seluruh fungsi memiliki limitation sendiri-sendiri. Untuk 2 fungsi ini,
setahu saya (dulu pernah baca di-help -- kok di help excel 2007 ini gak ada
penjelasannya ya.) sepertinya ada batasan untuk jumlah element sekitar
5rb-an. Persisnya berapa saya kurang pasti, itu juga sepertinya untuk MMult.
Sedang MInverse dibatasi kolom x baris sekitar 50-an x 50-an. Sedang untuk
array formula sendiri, beda lagi batasnya. Kalau Excel 2003 kebawah,
sepertinya sekitar 65535 cells dengan array formula per sheet (ini pernah
ngalamin),sedang excel 2007, untuk sekitar 1jt baris yang pernah dicoba,
bisa hanya saja lama proses kalkulasi (dipengaruhi engine).
Kira-kira, demikianlah dongeng sebelum tidurnya.
Semoga tidak membuat mimpi buruk.
Kid.
2010/2/28 zainul ulum <[email protected]>
>
>
> Jadi sebaiknya harus merubah coding saya dong.
> Apabila lihat funsgi vba-excel pakai object browser atau di help misal
> untuk
> fungsi:
>
> Function FileLen(PathName As String) As Long
>
> Hasilnya adalah long. Padahal kalo dipikir-pikir apakah ada nama folder
> yang
> panjangnya 2147483647 (batas atas data type long).
>
> Tanya #1 : Apakah ini adalah salah satu cara agar prosesnya lebih cepat?
>
> Sekalian tanya masalah alokasi memori:
> Saya pernah mengolah data pengukuran pasang surut air laut untuk menentukan
> prediksi pasang surut dengan menggunakan aplikasi fungsi matrix.
>
> Saya tulis di
>
>
> http://cadex.wordpress.com/2009/12/18/xls-svy-01-prediksi-pasut-dengan-vba-e
> xcel/
>
> Dalam proses perhitungan tersebut akan dibuat matrix dengan dimensi matrix
> sbb:
>
> MatrixA(696,19),MatrixL(696),MatrixX(19)
>
> Semuanya saya definisikan sebagai data type double di bagian declaration
> Dim MatrixA() as double, MatrixL() as double ,MatrixX() as double
>
> Tanya #2, Ada saran bagaimana mengatur alokasi memorin untuk menyimpan
> matrix?
>
> Mungkin bagi sebagian computer akan berjalan lebih lambat atau lebih cepat
> dari laptop saya...
>
> Tanya #3, Pada saat mengolah data 'pasang surut' tersebut awalnya saya
> memakai fungsi matrix di excel:
>
> application.worksheetfunction.MMULT() dan .MINVERSE()
>
> tetapi hasilnya error, mungkin karena fungsi di excel tidak bisa menghandle
> dimensi matrix dimensi 696x696. apakah memang demikian?
>
> Terimakasih
> _zainul_
>
> ________________________________________
> From: [email protected] <belajar-excel%40yahoogroups.com>[mailto:
> [email protected] <belajar-excel%40yahoogroups.com>]
> On Behalf Of Mr. Kid
> Sent: Sunday, February 28, 2010 12:04 PM
> To: [email protected] <belajar-excel%40yahoogroups.com>
> Subject: Re: [belajar-excel] kenapa INT((204.01 - 204) * 100) <> 1 ?
>
>
> Untungnya, ini berbicara dalam VBA Excel.
> Jadi, bisa dengan asumsi bahwa pengolahan tersebut (sebagian besar) adalah
> proses ETL untuk mendapatkan data yang dibutuhkan.
>
> Betul mas Zainul, Long dan Integer memiliki sifat yang sama sebagai
> datatype
> bilangan bulat, dan itu hanyalah sebuah kebiasaan saya saja. Ceritanya
> begini :
>
> Untuk suatu data yang jumlah cacahnya banyak dan harus disimpan oleh
> variabel itu dalam waktu lama (misal array bilangan bulat), maka sangat
> penting memperhatikan datatype berdasar alokasi memorinya.
>
> Tetapi untuk kasus sebuah variabel yang hanya menyimpan sesaat (misal suatu
> loop atau proses hitungan tertentu), maka tentunya yang diperhatikan adalah
> performance proses itu sendiri bukan alokasi memorinya, karena besar
> alokasi
> memori selalu tetap. Sedangkan untuk sistem operasi berbasis x86 (32 bit),
> proses dikerjakan selalu berdasar hitungan 32 bit. Datatype Long
> membutuhkan
> alokasi memori 4 byte (32 bit) jadi proses kerja tidak perlu mengkalkulasi
> luas memori, tinggal menuju ke ponter variabel itu, ambil seluruhnya. Jika
> pakai datatype Integer (2 byte = 16 bit), maka kerja akan menuju pointer
> tersebut, kalkulasi untuk ambil separo blok memori, baru dapat hasilnya.
>
> Kalau dengan komputer jaman sekarang tidak akan terasa bedanya, itu betul.
> Tapi tetap saja jumlah proses real yang dikerjakan komputer lebih sedikit
> dengan Long dibanding Integer.
>
> Kid.
>
> 2010/2/28 zainul ulum <[email protected] <zainul_ulum%40yahoo.com>>
>
> Maturnuwun mas Kid,
> Bermanfaat sekali penjelasannya.
>
> Ceritanya begini,
>
> Saya sedang mengolah data hasil ukuran sudut dari alat total station (TS)
> yang dinyatakan dalam derajat, menit dan detik. Jika hasil pengukurannya
> adalah 204 derajat, 1 menit, 1 detik hasil download dari TS tertulis
> 204.0101
>
> Jadi kalo data dari TS adalah 204.01, dibaca 204 derajat, 1 menit.
>
> Alasan kenapa saya memakai fungsi yang menghasilkan data type integer
> adalah
> mempertimbangkan bahwa hasil dari fungsi tersebut hanya dari angka 0 sampai
> 59.
>
> D = Int(DMS)'derajat DMS=Sudut dalam format d.mmss
> M = Int((DMS - D) * 100)'menit
> s = (DMS * 100 - Int(DMS * 100)) * 100'detik
>
> Dengan rumus di atas sebagian besar mendapatkan hasil yang saya harapkan,
> tetapi untuk sudut2 tertentu terjadi kesalahan. Misal untuk sudut 204.1
> D=204 tetapi M=0
>
> Kemudian saya ganti INT mejadi FIX, ternyata tetep aja M=0
>
> Sebelum ada jawaban dari mas Kid, karena pusing mikirin INT dan FIX
> akhirnya
> rumus saya rubah menjadi,
>
> s = Format(absDMS, "000.000000")
> Der = CInt(Left(s, 3))
> Men = CInt(Mid(s, 5, 2))
> Det = CDbl(Mid(s, 7, 2)) + CDbl(Right(s, 2) / 100)
>
> Kini, saatnya menerapkan saran dari Mr.Kid
>
> Apakah akibatnya jika semua data type yang semula integer dirubah menjadi
> long (integer)?
>
> Karena setahu saya ada hubungannya dengan alokasi memory yang akan dipakai
> jika integer adalah 2 byte dengan range -32768 to 32767
> Jika long adalah 4 byte dengan range -2147483648 to 2147483647
>
> Mohon maaf kepanjangan ceritanya
> _zainul_
> ________________________________________
> From: [email protected] <belajar-excel%40yahoogroups.com>[mailto:
> [email protected] <belajar-excel%40yahoogroups.com>]
> On Behalf Of Mr. Kid
> Sent: Sunday, February 28, 2010 5:24 AM
> To: [email protected] <belajar-excel%40yahoogroups.com>
> Subject: Re: [belajar-excel] kenapa INT((204.01 - 204) * 100) <> 1 ?
>
>
> Hai mas Zainul,
>
> datatype double dan single adalah bilangan approximate dan diproses dengan
> algoritma yang berbeda dengan bilangan bulat seperti integer atau long.
> Jadi
> nilai desimal suatu bilangan akan tersusun dalam banyak angka dibelakang
> koma yang dibulatkan. Sedangkan fungsi Int() akan membulatkan ke terkecil
> terdekat.
>
> Alhasil, semua bilangan approximate (double dan single) akan dibulatkan ke
> nilai terkecil terdekat. Sedangkan 1 didefinisikan sebagai nilai
> approcimate
> berupa 0.99sekian
>
> Fungsi konversi datatype berbeda dengan fungsi pembulatan suatu angka
> seperti Int()
> Int(99.99) = 99
> Int(-99.99) = -100
> Cint(99.99)=100
> Cint(-99.99)=-100
>
> maksud dari syntax mas Zainul adalah memeriksa apakah selisihnya bernilai
> 1,
> maka kerjakanlah keduanya sebagai bilangan bulat, atau jadikanlah hasil
> akhir sebagai bilangan bulat
>
> silakan dicoba, agar punya gambaran yang lebih jelas
> clng((204.01-204) * 100)
> 204.01 * 100 mod 204*100
> clng(204.01 * 100) - clng(204 * 100)
>
> Semoga bermanfaat.
> Kid.
> __________ Information from ESET NOD32 Antivirus, version of virus
> signature
> database 4901 (20100227) __________
>
> The message was checked by ESET NOD32 Antivirus.
>
> http://www.eset.com
>
>
>