劇遅 メモリ交換だけで古いセレロンパソコンを使えるレベルにアップグレード esprimo FH52/W 2950M SP016GLSTU160N22


ウチにある古いパソコンの富士通ESPRIMO FH52/W が酷く遅くなりました。OSの起動も遅く、アプリの起動も遅いです。さらにブラウザや事務ソフト程度の軽いソフトも突然固まります。30秒くらい待っていればまた使えるようになりますがストレスはあります。

古いパソコンはSSDに交換すると良いと言われていますが、イメージのコピーやパソコンの分解など手間が必要です。部品自体は安いですが面倒です。

一方でメモリ交換は簡単です。交換しやすい場所に取り付けられていたり、コピーなどの作業が不要だからです。 とは言ってもSSDに交換しないと意味がないとも言われています。

でも、とりあえずメモリを交換してみます。今回使ったのはシリコンパワーのメモリです。パソコンの機種名でググったらこのメモリの販売サイトが表示されました。16ギガは大げさですが、2500円と安いので買ってしまいました。今考えると8ギガでも良さそうですが、これはロマンということで。

FH52/Wのメモリ交換は裏蓋を外して、ドライバでシールドパネルを外すだけで出来ます。非常に簡単です。静電気だけには気を付けて交換してください。

その後、PCを再起動しますが、案の定、起動速度は改善していません。もちろんアプリの起動もそれほど速くなっていません。 ここだけ見ると残念ですが、大きな収穫もあります。

それは、アプリの利用が超快適になったところです。今まではアプリのメニューを開いただけで30秒くらい固まったりしていましたが、それが全く無くなりました。ネット閲覧もスムーズに画面遷移し、オフィスソフトや会計ソフトも普通に操作できるようになりました。

私の感覚では、朝起動したら立ち上げ放しの会社の事務用パソコンが遅いと感じている場合におすすめです。 ブラウザや会計ソフト、写真とか図が大量に入っていない文書程度で軽く固まる現象があれば是非、メモリを交換してみてください。


Windowsでウィンドウアプリを作成する覚書 MinGW64


 Windowsでアプリ作成というとMicrosoftのVisualStudioです。昔は有料でしたが、今では一部無料で使えるものがあります。ダウンロードして、プロジェクト作成ウィザードを実行すれば簡単なウィンドウが開けます。ただ、妙に大げさでブラックボックスなところもありますのでDIYプログラマにとっては気持ち悪いところがあります。ソフトウェア企業ならそういう開発環境などを丁寧に教えてくれることもありますが、独学だと複雑な開発環境は使いこなすのが難しいです。

そこで便利なのがMinGW64です。「ダウンロードして解凍して好きな場所にコピーしてパス通す。」これだけでビルドできます。知っていれば分かりやすいです。

ただ、パソコンを更新したりした場合にいつも悩むこともあります。それは、どのビルドをダウンロードすれば良かったのかです。もちろん、当時にダウンロードしたファイルを保管しておけば良いだけですが、いつでも手に入ると思って削除しているかもしれません。

この記事ではその覚書です。

まず、ダウンロードは有志の方々がビルドしてまとめたものが便利です。以下のURLにあります。

https://github.com/niXman/mingw-builds-binaries/releases

ここから私は

x86_64-14.2.0-release-posix-seh-ucrt-rt_v12-rev2

をダウンロードして解凍しました。7z形式なので解凍するツールは別途ダウンロードしてください。

ただ、色々ある意味がわからないと思います。ここでざっくりと意味を説明していきます。詳細は説明のリンク先から見てください。

x86_64 これがいわゆる64ビット版を示すものです。今ならこれで良いです。

posix はスレッドの形式です。windows独自形式もありパフォーマンスも高いですが、今は互換性という意味でposixを選ぶとのことです。

seh は例外処理の方法です。この方式はwindowsの本能に近い部分で処理される効率が良い処理とされています。片方は理屈で処理される処理です。

UCRT はwindows10以降であれば問題ないとのことです。今から普通な環境で実行できるアプリを作るのであれば問題無いと考えます。古いパソコンとかに対応する人は多分職業プログラマなのでこんな文章は読まないと考えます。

詳しい説明は以下のURLを見てください。
https://text.baldanders.info/remark/2018/03/mingw-w64/
https://qiita.com/syoyo/items/36935d8231c6ebd41262

ダウンロードしてパスを通し、再起動したら任意のフォルダでプロンプト画面を開き

G++ hoge.cpp

でビルドしてください。言葉足らずですが hoge.cpp にはコードを入れておいてください。

C++の関数での情報の渡し方。

 C++などC言語系では、情報がどのように渡されているか見えないことが多いです。コンピュータにある程度のメモリがあり、取り扱う情報も少なければそれほど気にはなりません。しかし、組み込みマイコンのようにメモリや演算速度が遅い場合や画像や動画、ビッグデータなどの情報が巨大な場合は処理速度に影響が出てきます。

このため、情報がどのようにやり取りされているかを意識する必要があります。繰り返しますが、これから示す効率の良いプログラミングは見た目が悪いです。つまり、可読性が悪いということです。 昔ながらのパフォーマンスが悪い記述方法は計算アルゴリズムの記述としてはシンプルなわけです。

だから、数学やアルゴリズムの研究としてプログラミングをする場合は、エラー処理や例外処理、無駄なコピーなどを気にせずにシンプルに記述すればよいわけです。全てに完璧と汎用性を求めすぎることは愚行です。

一方で業務で使われるプログラムの場合はそれ自体のシンプルさや可読性より処理速度やメモリー消費のほうが重要になります。今回はこのための考察をします。

普通な記述

int test(int arg){…};

こんな関数は普通に記述します。そして、余計なものが書かれていないのでわかりやすいです。昔から書かれている方法ですが、これは、関数を呼び出すときと、戻るときに二回コピーが発生します。ある意味無駄なわけです。でも繰り返しますがわかりやすいです。

ちなみにこの方法を現実に例えますと、「相手にファックスを送り、それに記入後、ファックスで返信」という方法です。書類なら素早いですが、大きなものでは実現不可です。

参照渡し

void test(int &arg) {…}

この方法は場所だけを関数に知らせます。そして、関数はその場所にあるデータを処理した後に、作業終了だけを伝えます。これは最も効率が良い方法だと言われますが、戻り値が無い不思議な関数でもあります。そもそも戻り値がない関数とは何なのか?と数学者に突っ込まれそうでもあります。だから、可読性が悪いわけです。

あと、この方法は実は現実的であったりします。家のトイレを修理してもらうために技術者を呼ぶという方法です。相手にはトイレの場所を言うだけです。そして、修理が終わった後はその報告だけ受けます。

移動

int test(int &&arg) {…}

この方法はデータを移動させます。これはC++の途中から生まれた考えです。例えると、壊れた電化製品を修理するためにメーカーに送り、修理後に戻してもらうというものです。これも現実世界では自然な考えです。

ただし、プログラミングではややわかりにくい moveという命令を使う必要があります。見られないコードが増えるので可読性が悪いです。

まとめ

元々のプログラミングは少ないデータを複雑なアルゴリズムで解析して、少ない計算結果を返すというものでした。 データは少ないが、計算が複雑というものです。しかし、今ではビッグデータに代表される、データが極端に大きいものが増えてきています。この場合にデータを渡すたびにコピーをしていたらそれだけで時間が食われてしまいます。だから、参照や移動を使って大きなデータをできるだけ動かさずに処理をする必要が出てきます。

数秒程度の処理であれば、コードの見やすさを重視することは重要ですが、参照や移動を使えば一週間の処理が一晩になるのであれば検討の価値はあると考えます。

ある程度プログラミングに慣れてきたら、実際のデータはどのように移動しているのか?を考える必要もあるのではないでしょうか?

  1. #include <iostream>
  2. #include <string>
  3. #include <vector>
  4. //原紙のコピーを作業者に渡す、作業者はそれに加筆する。そして作業者はコピーを取り戻す。(二回コピーされる、ファックスに近い)
  5. std::vector<std::string> fx(std::vector<std::string> arg){
  6.     
  7.     arg[0] = "xxxxx";
  8.     
  9.     return arg;
  10. }
  11. //原紙の場所を作業者に伝え、作業者はそれに加筆する。そして、作業者は作業を終わったことを通知する。(一度もコピーされないし、移動もない)
  12. void fy(std::vector<std::string> &arg){
  13.     
  14.     arg[0] = "yyyyy";
  15.     
  16. }
  17. //依頼主は原紙を渡し、作業者はそれに加筆する、そして、作業者はその原紙を返却する。
  18.     std::vector<std::string> fz(std::vector <std::string> &&arg) {
  19.         
  20.         arg[0] = "zzzzzz";
  21.         
  22.         return std::move(arg);
  23.         
  24.     }
  25. int main(){
  26.     std::vector <std::string> test;
  27.     
  28.     test.push_back("aaaa");
  29.     
  30.     test = fx(test); //移動するたびにコピーが作られる(ファックスで書類を送り、記入後、ファックスで受ける)
  31.     std::cout <<test[0]<< std::endl;
  32.     
  33.     fy(test); //移動もコピーも作られない(相手を自宅に呼び、書類に記入してもらう)
  34.     std::cout <<test[0]<< std::endl;
  35.     
  36.     test=fz(std::move(test)); //書類を郵送し、記入してもらい、また戻す
  37.     std::cout << test[0]<< std::endl;
  38.     //依頼主に渡したのにそれを受け取らずに処理した場合(やってはいけない)
  39.     fz(std::move(test)); //この時点でtestは無効な値である。
  40.     std::cout << test[0]<< std::endl;
  41.     
  42.     return 0;
  43.     
  44.     
  45. }



劇遅 メモリ交換だけで古いセレロンパソコンを使えるレベルにアップグレード esprimo FH52/W 2950M SP016GLSTU160N22

Amazonでメモリを購入します ウチにある古いパソコンの富士通ESPRIMO FH52/W が酷く遅くなりました。OSの起動も遅く、アプリの起動も遅いです。さらにブラウザや事務ソフト程度の軽いソフトも突然固まります。30秒くらい待っていればまた使えるようになりますがストレスはあ...